123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- /*
- * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
- * See the copyright notice in the ACK home directory, in the file "Copyright".
- */
- /* EXPRESSION SYNTAX PARSER */
- %lexical LLlex;
- %start If_expr, if_expression;
- {
- #include "arith.h"
- #include "LLlex.h"
- extern arith ifval;
- }
- if_expression
- { int is_unsigned = 0; }
- :
- constant_expression(&ifval, &is_unsigned)
- ;
- /* 7.1 */
- primary(arith *pval; int *is_uns;)
- :
- constant(pval, is_uns)
- |
- '(' expression(pval, is_uns) ')'
- ;
- unary(arith *pval; int *is_uns;)
- {int oper;}
- :
- unop(&oper)
- unary(pval, is_uns)
- { ch3mon(oper, pval, is_uns); }
- |
- primary(pval, is_uns)
- ;
- binary_expression(int maxrank; arith *pval; int *is_uns;)
- {int oper; arith val1; int u;}
- :
- unary(pval, is_uns)
- [%while (rank_of(DOT) <= maxrank)
- binop(&oper)
- binary_expression(rank_of(oper)-1, &val1, &u)
- {
- ch3bin(pval, is_uns, oper, val1, u);
- }
- ]*
- ;
- /* 7.13 */
- conditional_expression(arith *pval; int *is_uns)
- {arith val1 = 0, val2 = 0; int u;}
- :
- /* allow all binary operators */
- binary_expression(rank_of('?') - 1, pval, is_uns)
- [ '?'
- expression(&val1, is_uns)
- ':'
- assignment_expression(&val2, &u)
- { if (*pval) *pval = val1;
- else { *pval = val2; *is_uns = u; }
- }
- ]?
- ;
- /* 7.14 */
- assignment_expression(arith *pval; int *is_uns)
- :
- conditional_expression(pval, is_uns)
- ;
- /* 7.15 */
- expression(arith *pval; int *is_uns)
- {arith val1;
- int is_uns1;
- }
- :
- assignment_expression(pval,is_uns)
- [ ','
- assignment_expression(&val1, &is_uns1)
- {
- ch3bin(pval, is_uns, ',', val1, is_uns1);
- }
- ]*
- ;
- unop(int *oper;) :
- [ '-' | '!' | '~' ]
- {*oper = DOT;}
- ;
- multop:
- '*' | '/' | '%'
- ;
- addop:
- '+' | '-'
- ;
- shiftop:
- LEFT | RIGHT
- ;
- relop:
- '<' | '>' | LESSEQ | GREATEREQ
- ;
- eqop:
- EQUAL | NOTEQUAL
- ;
- arithop:
- multop | addop | shiftop
- |
- '&' | '^' | '|'
- ;
- binop(int *oper;) :
- [ arithop | relop | eqop | AND | OR ]
- {*oper = DOT;}
- ;
- constant(arith *pval; int *is_uns) :
- INTEGER
- {*pval = dot.tk_val;
- *is_uns = dot.tk_unsigned;
- }
- ;
- constant_expression (arith *pval; int *is_uns) :
- assignment_expression(pval, is_uns)
- ;
|