次のようなテキストを解析するために、倹約家 (python PEG パーサー ライブラリ) を使用しています。
text = """
block block_name_0
{
foo
}
block block_name_1
{
bar
}
"""
これは、テキスト全体を構成する単純な本文要件 (英数字でなければならない) を持つ一連のブロックです。文法は次のとおりです。
grammar = Grammar(r"""
file = block+
block = _ "block" _ alphanum _ start_brace _ block_body _ end_brace _
block_body = alphanum+
alphanum = ~"[_A-z0-9]+"
_ = ~"[\\n\\s]*"
start_brace = "{"
end_brace = "}"
""")
print (grammar.parse(text))
私が抱えている問題は、最初のブロックの後のブロックに解析エラーがあると、役に立たないエラー メッセージが表示されることです。例として、次のテキストを考えてみましょう。
text = """
block block_name_0
{
!foo
}
block block_name_1
{
bar
}
"""
これにより、有用なエラー メッセージが表示されます。
[omitted stack trace]
File "/lib/parsimonious/expressions.py", line 127, in match
raise error
parsimonious.exceptions.ParseError: Rule 'block_body' didn't match at '!foo
}
ただし、次のテキストがある場合:
text = """
block block_name_0
{
foo
}
block block_name_1
{
!bar
}
"""
次のエラーが表示されます。
File "/lib/parsimonious/expressions.py", line 112, in parse
raise IncompleteParseError(text, node.end, self)
parsimonious.exceptions.IncompleteParseError: Rule 'file' matched in its entirety, but it didn't consume all the text. The non-matching portion of the text begins with 'block block_name_1
{' (line 7, column 1).
シーケンスの最初のインスタンス (最初のブロック) と一致するように見えますが、2 番目のブロックで失敗した場合、すべてを失敗とは見なしません。ブロック 0 と同様のエラーが表示されるようにして、ブロック全体を解析できなかっただけでなく、ブロックの何が問題だったのかを正確に知ることができるようにします。
どんな助けでも大歓迎です!