/********************************************************************** Grammar for C-- programs **********************************************************************/ program ::= declList ; declList ::= declList decl | /* epsilon */ ; decl ::= varDecl | fnDecl ; varDeclList ::= varDeclList varDecl | /* epsilon */ ; varDecl ::= type id SEMICOLON | type id LSQBRACKET INTLITERAL RSQBRACKET SEMICOLON ; fnDecl ::= type id formals fnBody ; formals ::= LPAREN RPAREN | LPAREN formalsList RPAREN ; formalsList ::= formalDecl | formalDecl COMMA formalsList ; formalDecl ::= type id // note: no array parameters ; fnBody ::= LCURLY varDeclList stmtList RCURLY ; stmtList ::= stmtList stmt | /* epsilon */ ; stmt ::= CIN READ id SEMICOLON | CIN READ id LSQBRACKET exp RSQBRACKET SEMICOLON | COUT WRITE exp SEMICOLON | loc ASSIGN exp SEMICOLON | IF LPAREN exp RPAREN LCURLY varDeclList stmtList RCURLY | IF LPAREN exp RPAREN LCURLY varDeclList stmtList RCURLY ELSE LCURLY varDeclList stmtList RCURLY | WHILE LPAREN exp RPAREN LCURLY varDeclList stmtList RCURLY | RETURN exp SEMICOLON | RETURN SEMICOLON | fncall SEMICOLON ; exp ::= exp PLUS exp | exp MINUS exp | exp TIMES exp | exp DIVIDE exp | NOT exp | exp AND exp | exp OR exp | exp EQUALS exp | exp NOTEQUALS exp | exp LESS exp | exp GREATER exp | exp LESSEQ exp | exp GREATEREQ exp | MINUS term | term ; term ::= loc | INTLITERAL | STRINGLITERAL | TRUE | FALSE | LPAREN exp RPAREN | fncall ; fncall ::= id LPAREN RPAREN // fn call with no args | id LPAREN actualList RPAREN // with args ; actualList ::= exp | actualList COMMA exp ; type ::= INT | BOOL | VOID ; loc ::= id | id LSQBRACKET exp RSQBRACKET id ::= ID ;