私は Bison で、とりわけ次の構造を持つ言語用のパーサーを作成しています。
- 自己発送: [
identifier
arguments
] - 発送:【送料無料
expression
】identifier
arguments
] - 文字列のスライス:
expression
[expression
,expression
] - Python に似ています。
arguments
カンマで区切られた式のリストで、空にすることもできます。上記のすべては、それ自体でも式です。私の問題は、両方を解析する方法がわからないこと[method [other_method]]
と[someString[idx1, idx2].toInt]
、LALR(1) パーサーでこれを行うことができるかどうかです。
より正確には、次の例を見てみましょう: ( methodの結果で method を[a[b]]
呼び出します)。状態になると。(先読みは 2 番目の です)、次のようなものが続く可能性があるため(これは既に に縮小されています) に縮小するか (それ自体が に縮小され、上から 2 番目の構造を継続する可能性があります)、それを保持するかはわかりません。(そしてそれをシフトします)のリストが続くからです(この場合のように)。a
b
[a
[b]]
[
a
identifier
expression
a[b,c]
expression
identifier
arguments
[b]
このシフト/リデュースの競合は、私がこの文法を表現した方法によるものですか、それとも LALR(1) パーサーでこれらの構造のすべてを解析することはできませんか?
そして、より一般的な質問として、言語が特定のタイプのパーサーによって解析可能である/不可能であることをどのように証明できますか?