Improved constant arithmetic: had several bugs

This commit is contained in:
ceriel
1993-03-18 13:24:20 +00:00
parent a2bf695f83
commit a2cb61e0f0
11 changed files with 212 additions and 66 deletions

View File

@@ -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)
;