%union { int int_val; char *name_ptr; } %token ADDSY ANDSY ARRAYSY ASSIGNSY %token BARSY BEGINSY BYSY %token CARETSY CASESY CHARCONSTSY COLONSY COMMASY CONSTSY %token DEFINITIONSY DIVIDESY DIVSY DOSY DOTDOTSY DOTSY %token ELSIFSY ELSESY ENDSY EQSY EXITSY EXPORTSY %token FORSY FROMSY %token GESY GTSY %token IDENTSY IFSY INTCONSTSY IMPLEMENTATIONSY IMPORTSY INSY %token LBRACESY LBRACKETSY LPARENSY LESY LOOPSY LTSY %token MINUSSY MODSY MODULESY %token NESY NOTSY %token OFSY ORSY %token POINTERSY PROCEDURESY %token QUALIFIEDSY %token READSY RECORDSY REPEATSY RETURNSY RBRACKETSY RBRACESY RPARENSY %token SEMICOLONSY SETSY STRINGCONSTSY %token THENSY TIMESSY TOSY TYPESY %token UNTILSY %token VARSY %token WHILESY WITHSY WRITESY WRITELNSY %nonassoc EQSY NESY GTSY GESY LTSY LESY %left ADDSY MINUSSY ORSY %left TIMESSY DIVIDESY DIVSY MODSY ANDSY %nonassoc UNMINUSSY NOTSY %start CompilationUnit %% CompilationUnit : ProgramModule ; ProgramModule : ModuleStart SEMICOLONSY Block IDENTSY DOTSY ; ModuleStart : MODULESY IDENTSY ; Block : DeclarationList BeginClause StatementSequence ENDSY ; BeginClause : BEGINSY ; ProcedureHeading : PROCEDURESY ProcedureName FormalParameters ; ProcedureName : IDENTSY ; FormalParameters : LPARENSY OptFPSectionList RPARENSY COLONSY QualIdent | LPARENSY OptFPSectionList RPARENSY | /* empty */ ; OptFPSectionList : FPSectionList | /* empty */ ; FPSectionList : FPSection | FPSectionList SEMICOLONSY FPSection ; FPSection : VARSY IdentList COLONSY FormalType | IdentList COLONSY FormalType ; IdentList : IDENTSY | IDENTSY COMMASY IdentList ; FormalType : QualIdent ; DeclarationList : Declaration DeclarationList | /* empty */ ; Declaration : CONSTSY ConstDeclList | TYPESY TypeDeclList | VARSY VarDeclList | ProcedureDeclaration ; ConstDeclList : ConstElement ConstDeclList | /* empty */ ; ConstElement : IDENTSY EQSY ConstExpression SEMICOLONSY ; TypeDeclList : TypeElement TypeDeclList | /* empty */ ; TypeElement : IDENTSY EQSY Type SEMICOLONSY ; VarDeclList : VariableElement VarDeclList | /* empty */ ; VariableElement : IdentList COLONSY Type SEMICOLONSY ; ProcedureDeclaration: ProcedureHeading SEMICOLONSY Block IDENTSY SEMICOLONSY ; ConstExpression : ConstExpression ORSY ConstExpression | ConstExpression ANDSY ConstExpression | NOTSY ConstExpression | ConstExpression EQSY ConstExpression | ConstExpression NESY ConstExpression | ConstExpression LESY ConstExpression | ConstExpression GESY ConstExpression | ConstExpression LTSY ConstExpression | ConstExpression GTSY ConstExpression | ConstExpression ADDSY ConstExpression | ConstExpression MINUSSY ConstExpression | ConstExpression TIMESSY ConstExpression | ConstExpression DIVIDESY ConstExpression | ConstExpression DIVSY ConstExpression | ConstExpression MODSY ConstExpression | MINUSSY ConstExpression %prec UNMINUSSY | ADDSY ConstExpression %prec UNMINUSSY | LPARENSY ConstExpression RPARENSY | INTCONSTSY | CHARCONSTSY | STRINGCONSTSY | QualIdent ; Type : SimpleType | ArrayType | RecordType ; SimpleType : QualIdent | SubrangeType ; ArrayType : ARRAYSY SubrangeType OFSY Type ; RecordType : RECORDSY FieldListSequence OptSemi ENDSY ; SubrangeType : LBRACKETSY ConstExpression DOTDOTSY ConstExpression RBRACKETSY ; FieldListSequence : FieldList | FieldListSequence SEMICOLONSY FieldList ; FieldList : IdentList COLONSY Type ; OptSemi : SEMICOLONSY | /* empty */ ; StatementSequence : Statement | StatementSequence SEMICOLONSY Statement ; Statement : Assignment | ProcedureCall | IfStatement | WhileStatement | RepeatStatement | ForStatement | ReturnStatement | ReadStatement | WriteStatement | /* empty */ ; Assignment : Designator ASSIGNSY Expression ; ProcedureCall : QualIdent ActualParameters ; IfStatement : IfHead ThenPart ElsifSequence ElseClause ENDSY ; IfHead : IFSY Expression ; ThenPart : THENSY StatementSequence ; ElsifSequence : ElsifSequence ElsifHead THENSY StatementSequence | /* empty */ ; ElsifHead : ELSIFSY Expression ; ElseClause : ELSESY StatementSequence | /* empty */ ; WhileStatement : WhileHead WhileExpression DOSY StatementSequence ENDSY ; WhileHead : WHILESY ; WhileExpression : Expression ; RepeatStatement : RepeatHead StatementSequence UNTILSY Expression ; RepeatHead : REPEATSY ; ForStatement : ForHead ToHead ForExpression ByClause DOSY StatementSequence ENDSY ; ForHead : FORSY IDENTSY ASSIGNSY Expression ; ToHead : TOSY ; ForExpression : Expression ; ByClause : BYSY ConstExpression | /* empty */ ; ReturnStatement : RETURNSY OptExpression ; ReadStatement : READSY LPARENSY Designator RPARENSY ; WriteStatement : WRITESY LPARENSY Expression RPARENSY | WRITELNSY ; Designator : Designator LBRACKETSY ExpressionList RBRACKETSY | Designator DOTSY IDENTSY | IDENTSY ; ExpressionList : Expression | ExpressionList COMMASY Expression ; OptExpression : Expression | /* empty */ ; Expression : Expression ORSY Expression | Expression ANDSY Expression | NOTSY Expression | Expression EQSY Expression | Expression NESY Expression | Expression LESY Expression | Expression GESY Expression | Expression LTSY Expression | Expression GTSY Expression | Expression ADDSY Expression | Expression MINUSSY Expression | Expression TIMESSY Expression | Expression DIVIDESY Expression | Expression DIVSY Expression | Expression MODSY Expression | MINUSSY Expression %prec UNMINUSSY | ADDSY Expression %prec UNMINUSSY | LPARENSY Expression RPARENSY | INTCONSTSY | CHARCONSTSY | STRINGCONSTSY | IDENTSY LPARENSY OptExpressionList RPARENSY | Designator ; ActualParameters : LPARENSY OptExpressionList RPARENSY | /* empty */ ; OptExpressionList : ExpressionList | /* empty */ ; QualIdent : IDENTSY ; %% /***************************/ /***** yyerror *****/ /***************************/ yyerror () { } /* yyerror */