私はLemon parser generatorの基礎を学びたいと思っていますが、私はすぐに立ち往生しました。ここで小さなレモン文法で解析の競合を解決する
は小さな文法です:
%right PLUS_PLUS.
%left DOT.
program ::= expr.
member_expr ::= expr DOT IDENTIFIER.
lhs_expr ::= member_expr.
expr ::= lhs_expr.
expr ::= PLUS_PLUS lhs_expr.
それは1つの解析紛争原因:次のように私は最後のルールを書き換えた場合、一方
State 3:
(3) expr ::= lhs_expr *
(4) expr ::= PLUS_PLUS lhs_expr *
DOT reduce 3 expr ::= lhs_expr
DOT reduce 4 ** Parsing conflict **
{default} reduce 4 expr ::= PLUS_PLUS lhs_expr
を:
expr ::= PLUS_PLUS expr DOT IDENTIFIER.
を次にそれが引き起こします紛争はありません。しかし、私はこれが正しい道だとは思わない。
誰かが正しい方法と理由を説明できるかどうかは分かります。
[++ x ] . y
と
[]ちょうど私の方法です++ [x . y]
:二つの解釈と
++ x . y
:
あなたは物事の余分な名前なしでこれを考えることをお勧めします。どこにでも 'lhs_expr'があれば、実際に何が求められているかを明確に見るために' expr DOT IDENTIFIER'と書くことができます。すべてが 'expr'の面であれば、より明確に衝突を見ることができます。 –
これは、 'lhs_expr'は' expr DOT IDENTIFIER'以外のものにすることができます。この特定の文法には他の規則は含まれていません。なぜなら、それを最小限にしたいからです。 'IDENTIFIER'または' expr LBRACKET expr RBRACKET'などです。ルール 'PLUS_PLUS lhs_expr'を一度書くだけで、すべての可能な左辺の式が事前にインクリメントされています。 –