我有以下的语法解析器(这是一个小样本):Bison分析器不会前瞻令牌
expr:
ident assignop expr
{
$$ = new NAssignment(new NAssignmentIdentifier(*$1), $2, *$3);
} |
STAR expr %prec IDEREF
{
$$ = new NDereferenceOperator(*$2);
} |
STAR expr assignop expr %prec IDEREF
{
$$ = new NAssignment(new NAssignmentDereference(*$2), $3, *$4);
} |
... ;
...
assignop:
ASSIGN_EQUAL |
ASSIGN_ADD |
ASSIGN_SUBTRACT |
ASSIGN_MULTIPLY |
ASSIGN_DIVIDE ;
现在我试图解析以下任何行:
*0x8000 = 0x7000;
*mem = 0x7000;
但是,Bison不断看到“* mem”并减少了“STAR expr”规则,并且未执行预测以查看“STAR expr assignop ...”是否匹配。据我了解Bison,它应该做这个预测。我最接近的猜测是,%prec会关闭前瞻或类似的东西,但我不明白为什么会这样做(因为prec值相同)。
在这种情况下,我如何使它看起来超前?
编辑:
,它进入遇到当“明星EXPR”的状态是:
state 45
28 expr: STAR expr .
29 | STAR expr . assignop expr
35 | expr . binaryop expr
$default reduce using rule 28 (expr)
assignop go to state 81
binaryop go to state 79
所以我不明白为什么它捡$默认情况下它可以挑选assignop(注在这种情况下,parser.y文件中规则的顺序不会影响它选择哪一个;我尝试在标准'STAR expr'之上重新排序assignop')。
糟糕!我想我已经删除了这个问题,因为我已经解决了它。我现在更好地回答我的答案... – 2012-04-09 05:31:41