Previous Up Next

10 Expressions

A nest or a single ellipsis is allowed in some expression contexts, and causes ambiguity in others. For example, in a sequence expr, the nonterminal expr must be instantiated as an explicit C-language expression, while in an array reference, expr1 [ expr2 ], the nonterminal expr2, because it is delimited by brackets, can be also instantiated as , representing an arbitrary expression. To distinguish between the various possibilities, we define three nonterminals for expressions: expr does not allow either top-level nests or ellipses, nest_expr allows a nest but not an ellipsis, and dot_expr allows both. The EXPR macro is used to express these variants in a concise way.

expr  ::= EXPR(expr)
nest_expr  ::= EXPR(nest_expr)
|NEST(nest_expr, exp_whencode)
dot_expr  ::= EXPR(dot_expr)
|NEST(dot_expr, exp_whencode)
|...
EXPR(exp)  ::= exp assign_op exp
|exp metaidAssignOp exp
|exp++
|exp
|unary_op exp
|exp bin_op exp
|exp metaidBinOp exp
|expdot_exprexp
|(type) exp
|exp [dot_expr]
|expid
|exp -> id
|exp([PARAMSEQ(arg, exp_whencode)])
|id
|(type) { COMMA_LIST(init_list_elem) }
 |metaidExp
|metaidIdExp
 |metaidConst
|const
|(dot_expr)
|OR(exp)
|AND(exp)
arg  ::= nest_expr
|metaidExpList
exp_whencode  ::= when != expr
assign_op  ::= = | -= | += | *= | /= | %=
|&= | |= | ^= | <<= | >>=
bin_op  ::= * | / | % | + | -
|<<| >>| ^ | & | |
|< | > | <= | >= | == | != | && | ||
unary_op  ::= ++ || & | * | + | - | !

Previous Up Next