Improved constant arithmetic: had several bugs
This commit is contained in:
@@ -15,70 +15,75 @@ extern arith ifval;
|
||||
}
|
||||
|
||||
if_expression
|
||||
{ int is_unsigned = 0; }
|
||||
:
|
||||
constant_expression(&ifval)
|
||||
constant_expression(&ifval, &is_unsigned)
|
||||
;
|
||||
|
||||
/* 7.1 */
|
||||
primary(arith *pval;)
|
||||
primary(arith *pval; int *is_uns;)
|
||||
:
|
||||
constant(pval)
|
||||
constant(pval, is_uns)
|
||||
|
|
||||
'(' expression(pval) ')'
|
||||
'(' expression(pval, is_uns) ')'
|
||||
;
|
||||
|
||||
unary(arith *pval;)
|
||||
unary(arith *pval; int *is_uns;)
|
||||
{int oper;}
|
||||
:
|
||||
unop(&oper)
|
||||
unary(pval)
|
||||
{ ch3mon(oper, pval); }
|
||||
unary(pval, is_uns)
|
||||
{ ch3mon(oper, pval, is_uns); }
|
||||
|
|
||||
primary(pval)
|
||||
primary(pval, is_uns)
|
||||
;
|
||||
|
||||
binary_expression(int maxrank; arith *pval;)
|
||||
{int oper; arith val1;}
|
||||
binary_expression(int maxrank; arith *pval; int *is_uns;)
|
||||
{int oper; arith val1; int u;}
|
||||
:
|
||||
unary(pval)
|
||||
unary(pval, is_uns)
|
||||
[%while (rank_of(DOT) <= maxrank)
|
||||
binop(&oper)
|
||||
binary_expression(rank_of(oper)-1, &val1)
|
||||
binary_expression(rank_of(oper)-1, &val1, &u)
|
||||
{
|
||||
ch3bin(pval, oper, val1);
|
||||
ch3bin(pval, is_uns, oper, val1, u);
|
||||
}
|
||||
]*
|
||||
;
|
||||
|
||||
/* 7.13 */
|
||||
conditional_expression(arith *pval;)
|
||||
{arith val1 = 0, val2 = 0;}
|
||||
conditional_expression(arith *pval; int *is_uns)
|
||||
{arith val1 = 0, val2 = 0; int u;}
|
||||
:
|
||||
/* allow all binary operators */
|
||||
binary_expression(rank_of('?') - 1, pval)
|
||||
binary_expression(rank_of('?') - 1, pval, is_uns)
|
||||
[ '?'
|
||||
expression(&val1)
|
||||
expression(&val1, is_uns)
|
||||
':'
|
||||
assignment_expression(&val2)
|
||||
{ *pval = (*pval ? val1 : val2); }
|
||||
assignment_expression(&val2, &u)
|
||||
{ if (*pval) *pval = val1;
|
||||
else { *pval = val2; *is_uns = u; }
|
||||
}
|
||||
]?
|
||||
;
|
||||
|
||||
/* 7.14 */
|
||||
assignment_expression(arith *pval;)
|
||||
assignment_expression(arith *pval; int *is_uns)
|
||||
:
|
||||
conditional_expression(pval)
|
||||
conditional_expression(pval, is_uns)
|
||||
;
|
||||
|
||||
/* 7.15 */
|
||||
expression(arith *pval;)
|
||||
{arith val1;}
|
||||
expression(arith *pval; int *is_uns)
|
||||
{arith val1;
|
||||
int is_uns1;
|
||||
}
|
||||
:
|
||||
assignment_expression(pval)
|
||||
assignment_expression(pval,is_uns)
|
||||
[ ','
|
||||
assignment_expression(&val1)
|
||||
assignment_expression(&val1, &is_uns1)
|
||||
{
|
||||
ch3bin(pval, ',', val1);
|
||||
ch3bin(pval, is_uns, ',', val1, is_uns1);
|
||||
}
|
||||
]*
|
||||
;
|
||||
@@ -119,11 +124,13 @@ binop(int *oper;) :
|
||||
{*oper = DOT;}
|
||||
;
|
||||
|
||||
constant(arith *pval;) :
|
||||
constant(arith *pval; int *is_uns) :
|
||||
INTEGER
|
||||
{*pval = dot.tk_val;}
|
||||
{*pval = dot.tk_val;
|
||||
*is_uns = dot.tk_unsigned;
|
||||
}
|
||||
;
|
||||
|
||||
constant_expression (arith *pval;) :
|
||||
assignment_expression(pval)
|
||||
constant_expression (arith *pval; int *is_uns) :
|
||||
assignment_expression(pval, is_uns)
|
||||
;
|
||||
|
||||
Reference in New Issue
Block a user