- 论坛徽章:
- 0
|
本帖最后由 relipmoc 于 2013-05-07 17:51 编辑
回复 7# 蔡万钊
一点疑问,yacc里表达式的产生式这样写,怎么体现加减乘除的优先级呢?(当然为了简化读者理解是可以的)
expression: call_function
| '(' expression ')' { $ = $2 ;}
| expression '+' expression { $ = new CalcExprAST( $1, OPERATOR_ADD , $3 ); }
| expression '-' expression { $ = new CalcExprAST( $1, OPERATOR_SUB , $3 ); }
| expression '*' expression { $ = new CalcExprAST( $1, OPERATOR_MUL , $3 ); }
| expression '/' expression { $ = new CalcExprAST( $1, OPERATOR_DIV , $3 ); }
一般来说是这样:
e=e+t | t
t=t*f | f
f=(e)
到yacc里产生式例如这样:
e:
e '+' t
{
$$=$1+$3;
}
| e '-' t
{
$$=$1-$3;
}
| t
{
$$=$1;
};
t:
t '*' f
{
$$=$1*$3;
}
| t '/' f
{
$$=$1/$3;
}
| f
{
$$=$1;
};
f:
'(' e ')'
{
$$=$2;
}
| '-' e
{
$$ = - $2;//取负运算
}
| NUMBER
{
$$=$1;//NUMBER是LEX返回的token
};
这样就可以解析四则运算和括号了。 |
|