【发布时间】:2016-11-07 03:38:09
【问题描述】:
我正在尝试编写一个语法来解析英文句子中的数字,并且我可以成功解析多达 999 个。一旦我添加了支持千位的逻辑,我就会遇到 reduce 解析冲突,我我很难理解是什么原因造成的。
我附上了由柠檬生成的 parser.out 文件的一部分,我希望有人能对这个问题有所了解。我还包含了大部分语法,其中行以下的所有内容都可以自行运行,但是一旦我添加了行以上数千的逻辑,我就会开始遇到问题。
我的想法是我遇到了类似于“dangling 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 ::=
【问题讨论】: