Token | Lexeme |
---|---|
MAIN | "start:" |
SEMI | ";" |
COMMA | "," |
PIPE | "|" |
VAR | "var" |
INT | "integer" |
REAL | "float" |
STRING | "string" |
BOOL | "boolean" |
CHAR | "char" |
VOID | "void" |
DEF | "def" |
OUT | "out" |
FOR | "for" |
IF | "if" |
ELSE | "else" |
WHILE | "while" |
TO | "to" |
LOOP | "loop" |
READ | "<--" |
WRITE | "-->" |
WRITELN | "-->!" |
LPAR | "(" |
RPAR | ")" |
LBRAC | "{" |
RBRAC | "}" |
COLON | ":" |
ASSIGN | "<<" |
RETURN | "return" |
ID | [$_A-Za-z][$_A-Za-z0-9]* |
INTEGER_CONST | IntegerLiteral |
REAL_CONST | RealLiteral |
STRING_CONST | " " |
CHAR_CONST | ' ' |
TRUE | true |
FALSE | false |
PLUS | "+" |
MINUS | "-" |
TIMES | "*" |
DIV | "/" |
AND | "and" |
OR | "or" |
GT | ">" |
GE | ">=" |
LT | "<" |
LE | "<=" |
EQ | "=" |
NE | "!=" |
NOT | "not" |
STR_CONCAT | "&" |
Program ::= DeclList MainFunDecl DeclList ;
DeclList ::= VarDecl DeclList | FunDecl DeclList | /* empty */;
MainFunDecl ::= MAIN FunDecl;
VarDecl ::= Type IdInitList SEMI
| VAR IdInitObblList SEMI;
Type ::= INT | BOOL | REAL | STRING | CHAR;
IdInitList ::= ID
| IdInitList COMMA ID
| ID ASSIGN Expr
| IdInitList COMMA ID ASSIGN Expr;
IdInitObblList ::= ID ASSIGN Const
| IdInitObblList COMMA ID ASSIGN Const;
Const ::= INTEGER_CONST
| REAL_CONST
| TRUE
| FALSE
| STRING_CONST
| CHAR_CONST;
FunDecl ::= DEF ID LPAR ParamDeclList RPAR COLON TypeOrVoid Body;
Body ::= LBRAC VarDeclList StatList RBRAC
| LBRAC VarDeclList RBRAC;
ParamDeclList ::= /*empty */
| NonEmptyParamDeclList;
NonEmptyParamDeclList ::= ParDecl
| NonEmptyParamDeclList PIPE ParDecl;
ParDecl ::= Type IdList
| OUT Type IdList;
TypeOrVoid ::= Type | VOID;
VarDeclList ::= /* empty */
| VarDecl VarDeclList;
StatList ::= Stat | Stat StatList;
Stat ::= IfStat
| ForStat
| ReadStat SEMI
| WriteStat SEMI
| AssignStat SEMI
| WhileStat
| FunCall SEMI
| RETURN Expr SEMI
| RETURN SEMI;
IfStat ::= IF Expr THEN Body Else;
Else ::= /* empty */ | ELSE Body;
WhileStat ::= WHILE Expr LOOP Body;
ForStat ::= FOR ID ASSIGN INTEGER_CONST TO INTEGER_CONST LOOP Body;
ReadStat ::= IdList READ STRING_CONST
| IdList READ;
IdList ::= ID | IdList COMMA ID;
WriteStat ::= LPAR ExprList RPAR WRITE | LPAR ExprList RPAR WRITELN;
AssignStat ::= IdList ASSIGN ExprList;
FunCall ::= ID LPAR ExprList RPAR
| ID LPAR RPAR;
ExprList ::= Expr | Expr COMMA ExprList;
Expr ::= TRUE
| FALSE
| INTEGER_CONST
| REAL_CONST
| STRING_CONST
| CHAR_CONST
| ID
| FunCall
| Expr PLUS Expr
| Expr MINUS Expr
| Expr TIMES Expr
| Expr DIV Expr
| Expr AND Expr
| Expr POW Expr
| Expr STR_CONCAT Expr
| Expr OR Expr
| Expr GT Expr
| Expr GE Expr
| Expr LT Expr
| Expr LE Expr
| Expr EQ Expr
| Expr NE Expr
| MINUS Expr
| NOT Expr
| LPAR Expr RPAR;