英文の数字を解析する文法を書こうとしていますが、999 までは正常に解析できます。千の位をサポートするロジックを追加すると、reduce
解析の競合が発生し、苦労しています。何が原因かを理解することです。
レモンによって生成された parser.out ファイルの一部を添付しました。誰かがこの問題に光を当ててくれることを願っています。文法の大部分も含めて、1 行目より下のすべてが単独で機能しますが、1 行目より上の数千のロジックを追加すると、問題が発生し始めます。
私の考えでは、「ぶら下がっているelse」に似た問題に遭遇していますが、セパレーターを使用しています。ただし、それは通常shift-reduce
エラーとして現れますが、私はただのエラーのように見えreduce
ます。Lemon のドキュメントは少しまばらで、parser.out ファイルの内容の読み方が正確にはわかりません。たとえば、行HYPHEN reduce 15 ** Parsing conflict **
の偶数は何15
を指していますか?
どんな助けでも大歓迎です!
私の文法ファイルの一部:
final_number(A) ::= one_to_999999(B).
final_number(A) ::= ZERO.
one_to_999999(A) ::= thousands(B) separator one_to_999(C).
one_to_999999(A) ::= thousands(B).
one_to_999999(A) ::= one_to_999(B).
thousands(A) ::= one_to_999(B) separator THOUSAND.
thousands(A) ::= THOUSAND.
/* -------------------------------------- */
one_to_999(A) ::= hundreds(B) separator one_to_99(C).
one_to_999(A) ::= hundreds(B).
one_to_999(A) ::= one_to_99(B).
one_to_99(A) ::= tens(B) separator one_to_9(C).
one_to_99(A) ::= tens(B).
one_to_99(A) ::= ten_to_19(B).
one_to_99(A) ::= one_to_9(B).
hundreds(A) ::= one_to_9(B) separator HUNDRED.
hundreds(A) ::= HUNDRED.
separator ::= WHITESPACE.
separator ::= HYPHEN.
separator ::= .
エラーのある parser.out の部分:
State 5:
one_to_99 ::= tens * separator one_to_9
(15) one_to_99 ::= tens *
separator ::= * WHITESPACE
separator ::= * HYPHEN
(65) separator ::= *
$ reduce 15 one_to_99 ::= tens
THOUSAND reduce 15 one_to_99 ::= tens
WHITESPACE shift-reduce 63 separator ::= WHITESPACE
WHITESPACE reduce 15 ** Parsing conflict **
HYPHEN shift-reduce 64 separator ::= HYPHEN
HYPHEN reduce 15 ** Parsing conflict **
separator shift 4
{default} reduce 65 separator ::=