! ' |\r|\n|\t' "IF" "ELSE" "WHILE" "DO" "SAY" "WRITE" "READ" '{' '}' ';' '=' '==' '!=' '<=' '>=' '>' '<' '\+' '\-' '/' '\*' '\(' '\)' '#' '[A-Za-z_][A-Za-z0-9_]*' Identifier '\'([^\']|\'\')*\'' String [* %match = %match.substr( 1, %match.length - 2 ); %match = %match.replace( /''/g, "\'" ); *] '[0-9]+' Integer '[0-9]+\.[0-9]*|[0-9]*\.[0-9]+' Float ; ## Program: Program Stmt | ; Stmt_List: Stmt_List Stmt | ; Stmt: IF Expression Stmt | IF Expression Stmt ELSE Stmt | WHILE Expression DO Stmt | DO Stmt WHILE Expression ';' | SAY String ';' | WRITE Expression ';' | READ Identifier ';' | Identifier '=' Expression ';' | '{' Stmt_List '}' | ';' ; Expression: Expression '==' AddSubExp | Expression '<' AddSubExp | Expression '>' AddSubExp | Expression '<=' AddSubExp | Expression '>=' AddSubExp | Expression '!=' AddSubExp | AddSubExp ; AddSubExp: AddSubExp '-' MulDivExp | AddSubExp '+' MulDivExp | MulDivExp ; MulDivExp: MulDivExp '*' NegExp | MulDivExp '/' NegExp | NegExp ; NegExp: '-' Value | Value ; Value: Integer | Float | Identifier | '(' Expression ')' ;