G := (N, T, P, S) S:= prgm T := { "{", "}", CONST, EPSILON, ID, NUMBER, "[", "]", BASIC, "||", "&&", "==", "!=", "<", "<=", ">=", ">", "=", "+=", "-=", "*=", "/=", "%=", "&=", "|=", "^=", "<<=", ">>=", ";", IF, "(", ")", ELSE, WHILE, DO, SWITCH, BREAK, RETURN, DUMP, STRING, EXIT, DEFAULT, CASE, "|", "^", "&", "<<", ">>", "+", "-", "*", "/", "%", "~", "!", "^", ",", TRUE, FALSE } N := { prgm, block, decls, const, decl, type, stmts, bool, join, equality, rel, loc, stmt, optexpr, cases, bitor, bitxor, bitand, shift, expr, term, unary, post, call, optparams, params, factor } P := { prgm -> block block -> { decls stmts } decls -> decls const | EPSILON const -> CONST decl | decl decl -> type ID; type -> type [NUMBER] | BASIC stmts -> stmts stmt | EPSILON bool -> bool || join | join join -> join && equality | equality equality -> equality == rel | equality != rel | rel rel -> bitor < bitor | bitor <= bitor | bitor >= bitor | bitor > bitor | bitor loc -> loc [ bool ] | ID stmt -> loc = bool ; | loc += bool ; | loc -= bool ; | loc *= bool ; | loc /= bool ; | loc %= bool ; | loc <<= bool ; | loc >>= bool ; | loc &= bool ; | loc |= bool ; | loc ^= bool ; | IF ( bool ) stmt | IF ( bool ) stmt ELSE stmt | WHILE ( bool ) stmt | DO stmt WHILE ( bool ) ; | FOR ( optexpr ; optexpr ; optexpr ) stmt | SWITCH ( bool ) cases | BREAK ; | RETURN bool ; | DUMP STRING | EXIT ; | block optexpr -> EPSILON | bool cases -> cases DEFAULT stmt | cases CASE bool : stmt | CASE stmt bitor -> bitor | bitxor | bitxor bitxor -> bitxor ^ bitand | bitand bitand -> bitand & shift | shift shift -> shift << expr | shift >> expr | expr expr -> expr + term | expr - term | term term -> term * unary | term / unary | term % unary | unary unary -> ~ unary | ! unary | ++ unary | -- unary | post post -> post ++ | post -- | call call -> ID ( optparams ) | factor optparams -> params | EPSILON params -> params , bool | bool factor -> ( bool ) | loc | NUMBER | STRING | TRUE | FALSE }