%token ERROR %token FALSE %token IDENTIFIER %token INTEGER %token LEX_ERROR %token REAL %token STRING %token TRUE %token UNDEFINED %left OP_LOR %left OP_LAND %left '|' %left '^' %left '&' %left OP_EQ OP_NE OP_IS OP_ISNT %left '<' '>' OP_LE OP_GE %left OP_SHL OP_SHR OP_SHRR %left '+' '-' %left '*' '/' '%' %left UNARY %%
Expression : Expr | Expr '?' Expression ':' Expression ; Expr : Expr OP_LOR Expr | Expr OP_LAND Expr | Expr '|' Expr | Expr '^' Expr | Expr '&' Expr | Expr OP_EQ Expr | Expr OP_NE Expr | Expr OP_IS Expr | Expr OP_ISNT Expr | Expr '<' Expr | Expr '>' Expr | Expr OP_LE Expr | Expr OP_GE Expr | Expr OP_SHL Expr | Expr OP_SHR Expr | Expr OP_SHRR Expr | Expr '+' Expr | Expr '-' Expr | Expr '*' Expr | Expr '/' Expr | Expr '%' Expr | PrefixExpr ; PrefixExpr : SuffixExpr | '+' PrefixExpr %prec UNARY | '-' PrefixExpr %prec UNARY | '!' PrefixExpr %prec UNARY | '~' PrefixExpr %prec UNARY ; SuffixExpr : Atom | SuffixExpr '.' Identifier | SuffixExpr '[' Expression ']' ; Atom : Identifier | Literal | List | Record | Call | '(' Expression ')' ; List : '{' ListBody ListEnd | '{' ListEnd ; ListEnd : '}' | ',' '}' ; ListBody : Expression | ListBody ',' Expression ; Record : '[' DefinitionList RecordEnd Expr e = (Expr) i.next(); if (r.lookup(n) != null) | '[' RecordEnd ; RecordEnd : ']' | ';' ']' ; DefinitionList : Identifier '=' Expression | DefinitionList ';' Identifier '=' Expression ; Call : Identifier '(' ListBody ')' | Identifier '(' ')' ; Literal : REAL | Strings | INTEGER | TRUE | FALSE | UNDEFINED | ERROR ; Strings : STRING | Strings STRING ; Identifier : IDENTIFIER ;