我正在尝试编写一个语法来解析英文句子中的数字,并且我可以成功解析多达 999 个。一旦我添加了支持数千位的逻辑,我就会遇到reduce
解析冲突,我很难过了解是什么原因造成的。
我附上了柠檬生成的 parser.out 文件的一部分,我希望有人能对这个问题有所了解。我还包含了大部分语法,行下的所有内容都可以自行运行,但是一旦我添加了行上数千的逻辑,我就开始遇到问题。
我的想法是我遇到了一个类似于“悬空其他”的问题,但我的分隔符。但是,这通常表现为一个shift-reduce
错误,而看起来我只是一个reduce
错误。Lemon 文档有点稀疏,我不确定如何读取 parser.out 文件的内容。例如,在 lineHYPHEN reduce 15 ** Parsing conflict **
中,15
even 指的是什么?
任何帮助将不胜感激!
我的语法文件的一部分:
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 ::=