Other improvements are:
primary_expr
: ident
| int
| double
| char
| string
| "(" expr ")"
.
postfix_expr
: postfix_expr "[" expr LIST "]"
| postfix_expr "(" assignment_expr LIST OPT ")"
| postfix_expr "." ident "(" assignment_expr LIST OPT ")"
| postfix_expr "." ident
| postfix_expr "++"
| postfix_expr "--"
| primary_expr
.
unary_expr
: "++" unary_expr
| "--" unary_expr
| "+" unary_expr
| "-" unary_expr
| "!" unary_expr
| postfix_expr
.
l_expr1
: l_expr1 "*" unary_expr
| l_expr1 "/" unary_expr
| l_expr1 "%" unary_expr
| unary_expr
.
l_expr2
: l_expr2 "+" l_expr1
| l_expr2 "-" l_expr1
| l_expr1
.
l_expr3
: l_expr3 "<<" l_expr2
| l_expr3 ">>" l_expr2
| l_expr2
.
l_expr4
: l_expr4 "<=" l_expr3
| l_expr4 ">=" l_expr3
| l_expr4 "<" l_expr3
| l_expr4 ">" l_expr3
| l_expr4 "==" l_expr3
| l_expr4 "!=" l_expr3
| l_expr3
.
l_expr5 : l_expr5 "&&" l_expr4 | l_expr4 .
l_expr6 : l_expr6 "||" l_expr5 | l_expr5 .
expr
: l_expr6 "?" l_expr6 ":" expr
| l_expr6
.
assignment_expr
: unary_expr assignment_operator assignment_expr
| expr
.
assignment_operator
: "="
| "*="
| "/="
| "%="
| "+="
| "-="
| "<<="
| ">>="
.
declaration
: type_specifier ident "[" expr LIST "]" ";"
| type_specifier ident ("=" expr) OPT ";"
.
type_specifier
: "bool"
| "int"
| "double"
| "string"
| "textbuffer"
| "image"
| "color"
.
statement
: declaration
| "{" statement SEQ OPT "}"
| assignment_expr OPT ";"
| "if" "(" expr ")" statement ("else" statement) OPT
| "while" "(" expr ")" statement
| "for" ident "from" expr "to" expr statement
.
root : statement SEQ OPT .