私は自分が設計している言語の基本的な骨組みを作ろうとしており、 Parsimoniousを使用して構文解析を実行しようとしています。現時点では、次の文法を宣言しています。
grammar = Grammar(
"""
program = expr*
expr = _ "{" lvalue (rvalue / expr)* "}" _
lvalue = _ ~"[a-z0-9\\-]+" _
rvalue = _ ~".+" _
_ = ~"[\\n\\s]*"
"""
)
次のような単純な入力文字列の結果の AST を出力しようとすると"{ do-something some-argument }"
:
print(grammar.parse("{ do-something some-argument }"))
倹約家はそれを完全に拒否することを決定し、次のやや不可解なエラーを表示します。
Traceback (most recent call last): File "tests.py", line 13, in <module> print(grammar.parse("{ do-something some-argument }")) File "/usr/local/lib/python2.7/dist-packages/parsimonious/grammar.py", line 112, in parse return self.default_rule.parse(text, pos=pos) File "/usr/local/lib/python2.7/dist-packages/parsimonious/expressions.py", line 109, in parse raise IncompleteParseError(text, node.end, self) parsimonious.exceptions.IncompleteParseError: Rule 'program' matched in its entirety, but it didn't consume all the text. The non-matching portion of the text begins with '{ do-something some-' (line 1, column 1).
最初は、これは空白ルールに関連する問題かもしれないと思っていまし_
たが、特定の場所で空白ルールを削除しようとして何度か失敗した後も、同じエラーが発生していました。
オンラインで検索してみましたが、関連性が低いと思われるのはこの質問だけで、何の役にも立ちませんでした。
文法に何か問題がありますか? 入力を正しい方法で解析していませんか? 誰かがこれに対する可能な解決策を持っているなら、それは大歓迎です。