私は自然の文法規則を書きたいと思います:
program = { expression }
ここで{}
は 1 以上を示します。
たとえば、Lua の文法は同じ構文を使用します。
chunk ::= {stat [`;´]} [laststat [`;´]]
これは可能ですか?これは文脈自由文法に準拠していますか?
最も簡単な解決策は次のとおりだと思います。
program : expression
| program NEWLINE expression
これは、PLY が LR 文法を生成するためのみ機能します。非終端記号は、LL 文法でそれ自体 (左再帰) で開始することはできません (ANTLR などのツールを使用している場合)。
次のこともできます。
program : expression
| expression NEWLINE program
この 2 番目のバージョンは、LL 文法と LR 文法の両方と互換性があるため優れていますが、LR パーサーには最初の規則の方が効率的だと思います。
私は答えを見つけました:
program : expression
| expression NEWLINE expression