2 * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
3 * See the copyright notice in the ACK home directory, in the file "Copyright".
5 /* EXPRESSION SYNTAX PARSER */
8 %start If_expr, if_expression;
18 { int is_unsigned = 0; }
20 constant_expression(&ifval, &is_unsigned)
24 primary(arith *pval; int *is_uns;)
26 constant(pval, is_uns)
28 '(' expression(pval, is_uns) ')'
31 unary(arith *pval; int *is_uns;)
36 { ch3mon(oper, pval, is_uns); }
41 binary_expression(int maxrank; arith *pval; int *is_uns;)
42 {int oper; arith val1; int u;}
45 [%while (rank_of(DOT) <= maxrank)
47 binary_expression(rank_of(oper)-1, &val1, &u)
49 ch3bin(pval, is_uns, oper, val1, u);
55 conditional_expression(arith *pval; int *is_uns)
56 {arith val1 = 0, val2 = 0; int u;}
58 /* allow all binary operators */
59 binary_expression(rank_of('?') - 1, pval, is_uns)
61 expression(&val1, is_uns)
63 assignment_expression(&val2, &u)
64 { if (*pval) *pval = val1;
65 else { *pval = val2; *is_uns = u; }
71 assignment_expression(arith *pval; int *is_uns)
73 conditional_expression(pval, is_uns)
77 expression(arith *pval; int *is_uns)
82 assignment_expression(pval,is_uns)
84 assignment_expression(&val1, &is_uns1)
86 ch3bin(pval, is_uns, ',', val1, is_uns1);
109 '<' | '>' | LESSEQ | GREATEREQ
117 multop | addop | shiftop
123 [ arithop | relop | eqop | AND | OR ]
127 constant(arith *pval; int *is_uns) :
130 *is_uns = dot.tk_unsigned;
134 constant_expression (arith *pval; int *is_uns) :
135 assignment_expression(pval, is_uns)