我有以下解析器语法(这是一个小示例):
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...”是否匹配。据我了解野牛,它应该做这个前瞻性。我最接近的猜测是 %prec 正在关闭前瞻或类似的奇怪东西,但我不明白为什么会这样做(因为 prec 值是相等的)。
在这种情况下,如何让它执行前瞻?
编辑:
遇到'STAR 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 时选择 $default (请注意,在这种情况下,parser.y 文件中规则的顺序不会影响它选择哪一个;我已经尝试重新排序 assignop 一个高于标准的'STAR expr')。