私は次のパーサー文法を持っています(これは小さなサンプルです):
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」ルールを減らし、「STARexprassignop...」が一致するかどうかを確認するための先読みを実行しません。私がバイソンを理解している限り、それはこの先読みをしているはずです。私の最も近い推測は、%precが先読みまたはそのような奇妙なものをオフにしているということですが、なぜそうなるのかわかりません(prec値は同等であるため)。
この場合、先読みを実行するにはどうすればよいですか?
編集:
'STARexpr'に遭遇したときに入る状態は次のとおりです。
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を並べ替えてみました。標準の「STARexpr」より上)。