The project will include a scanner, symbol table, parser and (time permitting) type checker and intermediate code generator. The specifications for the language's syntax are as follows:
Comments are surrounded by { and } Blanks between tokens are optional, except reserved words must be surrounded by blanks, newlines, the beginning of the program or the final period. Token id matches a letter or a letter followed by letters and digits" letter -> [a-zA-Z] digit -> [0-9] id -> letter (letter | digit)* Token num matches unsigned integers digits -> digit digit* optional_fractional -> . digits | -> optional_exponent -> ( E | (+ | - | e ) digits) | -> num -> digits optional_fraction optional_exponent Keywords are reserved and appear in boldface in the grammar The relational operators (relops) are =, >, <, >=, <=, <> The addops are +, -, OR The mulops are *, /, DIV, MOD, AND The lexeme for token assignop is :=
Program -> Header Declarations Block . Header -> program id ; Declarations -> VariableDeclarationSection ProcedureDeclarations VariableDeclarationSection -> VAR VariableDeclarations | <epsilon> VariableDeclarations -> VariableDeclarations VariableDeclaration | VariableDeclaration VariableDeclaration -> IdentifierList : Type ; IdentifierList -> IdentifierList , id | id Type -> integer | real ProcedureDeclarations -> ProcedureHeader Declarations Block ; ProcedureHeader -> procedure id Arguments; Arguments -> ( ParameterList ) | <epsilon> ParameterList -> ParameterList ; ParameterDeclaration | ParameterDeclaration ParameterDeclaration -> id : Type Block -> begin Statements end Statements -> Statements ; Statement | Statement Statement -> id := Expression | id ( ExpressionList ) | Block | if Expression then Statement ElseClause | while Expression do Statement | <epsilon> ElseClause -> else Statement | <epsilon> ExpressionList -> ExpressionList , Expression | Expression Expression -> SimpleExpression relop SimpleExpression | SimpleExpression SimpleExpression -> Term | addop Term | SimpleExpression addop Term Term -> Term mulop Factor | Factor Factor -> id | num | ( Expression ) | not Factor