は、私は他の人の間で、次の構文を持つ言語のためのBisonパーサを書いています:これはLALR(1)パーサーによって解析できますか?
- 自己派遣:[
identifier
arguments
] - 派遣:[
expression
。identifier
arguments
] - 文字列スライシング:
expression
[expression
、expression
] - Pythonに似ています。
arguments
はカンマで区切られた式のリストです。空の場合もあります。上のすべてが独自の表現でもあります。 私の問題は、[method [other_method]]
と[someString[idx1, idx2].toInt]
の両方を解析する方法がわからないこと、またはLALR(1)パーサーでこれをすべて行うことができるかどうかわからないことです。
より正確には、次の例を考えてみましょう。[a[b]]
(メソッドb
の結果を持つa
メソッドを呼び出します)。状態が[a
に達したとき。 [b]]
(先読みが第二[
ある)a[b,c]
のようなものは、それ自体がexpression
に減少し、第二構築物で続けることができた(続く可能性があるので、それはexpression
に(すでにidentifier
に縮小されています)a
を削減するかどうかを知ることができませんarguments
のリスト(この場合は[b]
など)が続くので、identifier
(およびそれをシフトしてください)のままにしてください。
この文法をどのように表現したかによって、このシフト/リダクションの競合が起こっているのですか、またはLALR(1)パーサーでこれらの構文をすべて解析できませんか?
もっと一般的な質問ですが、言語が特定の種類のパーサーによって解析できないことをどのように証明できますか?
"特定の種類のパーサーによって、何かが解析可能であるかどうかをどのように証明できますか?" 「何か」を明示してください。 [言語と文法の違い](/ a/476009/824425)(その答えはLL(1)に関するあなたの最後の質問に答えるはずですが、かなり一般的なパーサーのタイプに一般化しています)。あなたがここで指定しているのは、言語のいくつかの機能ですが、文法がなければ、実際に話すことはあまりありません。 –
@Rhymoid私はそれをもっときれいに編集しました。私は文法ではなく、言語について尋ねていました。そして、質問の一部として書いた文法を追加する必要はないと思っています。なぜなら、LALR(* 1)によって*言語*(より正確にはその構文の一部)が解析可能かどうかを尋ねているからです。文法ではありません。 –
@EJP私は持っています。私は上記のshift/reduceコンフリクトを持つ文法を書いた。私はそれを避ける方法をたくさん考えて失敗しました。そして今、私は、文法の書き方にかかわらず、LALR(1)パーサーでは解析できない言語そのものを考えていました。 –