This page last changed on Nov 29, 2007 by carlos.gonzalez.

Gramática del Lenguaje SOberon

La siguiente gramática está escrita en uno de los estilos de BNF:

  • Los Símbolos no-terminales aparecen como identificadores en mayúsculas y minúsculas.
  • Los Símbolos terminales aparecen entre comillas.
  • La definición de los componentes léxicos aparece como parte de la gramática, como suele hacerse en BNF.

Deben tomar en cuenta que:

  • En SOberon, todas las palabras reservadas deben estar en mayúscula.
  • Para este proyecto consideraremos que dos identificadores en SOberon que tienen las mismas letras y pero difieren en mayúsculas y minúsculas son distintos.

La Gramática

module = "MODULE" ident ";" [ImportList] DeclarationSequence
["BEGIN" StatementSequence] "END" ident "."

ImportList = "IMPORT" ident {"," ident} ";"

DeclarationSequence =  {"CONST" {ConstantDeclaration ";"} |
"TYPE" {TypeDeclaration ";"} |
"VAR" {VariableDeclaration ";"} }
{ProcedureDeclaration ";"}

ConstantDeclaration = ident "=" ConstExpression

ConstExpression = expression

expression = SimpleExpression [relation SimpleExpression]

SimpleExpression = ["+"|"-"] term {AddOperator term}

term = factor {MulOperator factor}

factor = number | CharConstant | string |
designator [ActualParameters] | "(" expression ")"

CharConstant = '"' character '"'

string = '"' {character} '"'

designator = qualident {"." ident | "[" ExpList "]" | "(" qualident ")" }

ExpList = expression {"," expression}

ActualParameters = "(" [ExpList] ")"

MulOperator = "*" | "/" | "DIV" | "MOD" | "&"

AddOperator = "+" | "-" | "OR"

relation = "=" | "#" | "<" | "<=" | ">" | ">="

TypeDeclaration = ident "=" type

type = qualident | ArrayType | RecordType | PointerType | ProcedureType

qualident = [ident "."] ident

ArrayType = "ARRAY" length {"," length} "OF" type

length = ConstExpression

RecordType = "RECORD" ["(" BaseType ")"] FieldListSequence "END"

BaseType = qualident

FieldListSequence = FieldList {";" FieldList}

FieldList = [IdentList ":" type]

IdentList = ident {"," ident}

ProcedureType = "PROCEDURE" [FormalParameters]

VariableDeclaration = IdentList ":" type

ProcedureDeclaration = ProcedureHeading ";" ProcedureBody ident

ProcedureHeading = "PROCEDURE" ident [FormalParameters]

FormalParameters = "(" [FPSection {";" FPSection}] ")" [":" qualident]

FPSection = ["VAR"] ident {"," ident} ":" FormalType

FormalType = {"ARRAY" "OF"} qualident

ProcedureBody = DeclarationSequence ["BEGIN" StatementSequence] "END"

StatementSequence = statement {";" statement}

statement = [assignment | ProcedureCall | IfStatement | CaseStatement |
WhileStatement | RepeatStatement | LoopStatement |
"EXIT" | "RETURN" [expression] ]

assignment = designator ":=" expression

ProcedureCall = designator [ActualParameters]

IfStatement = "IF" expression "THEN" StatementSequence
{"ELSIF" expression "THEN" StatementSequence}
["ELSE" StatementSequence] "END"

CaseStatement = "CASE" expression "OF" case
{"|" case}
["ELSE" StatementSequence] "END"
case = [CaseLabelList ":" StatementSequence]

CaseLabelList = CaseLabels
{"," CaseLabels}
CaseLabels = ConstExpression [".." ConstExpression]

WhileStatement = "WHILE" expression "DO" StatementSequence "END"

RepeatStatement = "REPEAT" StatementSequence "UNTIL" expression

LoopStatement = "LOOP" StatementSequence "END"

ident = letter {letter | digit}

letter = "A" .. "Z" | "a" .. "z"

number = digit {digit}

digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"

comment = "(" any ")"

donde any representa cualquier cadena de caracteres que no incluya "(" ni ")".

Links Importantes

Document generated by Confluence on Oct 04, 2010 11:25