primary_expr : ident >" l_expr2 [ls] | l_expr2 . l_expr4 : l_expr4 "<=" l_expr3 [le] | l_expr4 ">=" l_expr3 [ge] | l_expr4 "<" l_expr3 [lt] | l_expr4 ">" l_expr3 [gt] | l_expr4 "==" l_expr3 [eq] | l_expr4 "!=" l_expr3 [ne] | l_expr3 . l_expr5 : l_expr5 "^" l_expr4 [bexor] | l_expr4 . l_expr6 : l_expr6 "&" l_expr5 [land] | l_expr5 . l_expr7 : l_expr7 "|" l_expr6 [lor] | l_expr6 . l_expr8 : l_expr8 "&&" l_expr7 [land] | l_expr7 . l_expr9 : l_expr9 "||" l_expr8 [lor] | l_expr8 . conditional_expr : l_expr9 "?" l_expr9 ":" conditional_expr [if_expr] | l_expr9 . assignment_expr : ident >+var "=" assignment_expr [varass] | unary_expr assignment_operator assignment_expr [assignment] | conditional_expr . assignment_operator : "=" [ass] | "*=" [times_ass] | "/=" [div_ass] | "%=" [mod_ass] | "+=" [add_ass] | "-=" [sub_ass] | "<<=" [sl_ass] | ">>=" [sr_ass] | "&=" [and_ass] | "|=" [or_ass] | "^=" [exor_ass] . expr : assignment_expr LIST. constant_expr : conditional_expr . funcdecl : "function" ident >var { "(" ident >var LIST OPT ")" "{" statement SEQ "}" } [funcdec] . vardecl : "var" ident >var ("=" expr)OPT [var] . statement : (ident | "case" constant_expr | "default") ":" statement [label] | { "{" statement SEQ "}" } [block] | expr ";" OPT | "if" "(" expr ")" statement ("else" statement) OPT [if] | "switch" "(" expr ")" statement [switch] | "while" "(" expr ")" statement [while] | "do" statement "while" "(" expr ")" ";" OPT [do] | "for" "(" (expr | vardecl)OPT ";" expr OPT ";" expr OPT ")" statement [for] | "goto" ident ";" OPT [goto] | "continue" ";" OPT [cont] | "break" ";" OPT [break] | "return" expr OPT ";" OPT [ret] | "with" "(" ident ")" statement [with] | vardecl ";" OPT | ";" . root : { (statement | funcdecl) SEQ OPT } eof .