1

英文の数字を解析する文法を書こうとしていますが、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 ::=
4

1 に答える 1