消除 PLY 语法中的这种 Shift-Reduce 冲突

Eliminating this Shift-Reduce conflict in PLY Grammar

所以我的源代码中有这些语法产生式。

function_defination : FUNC WHITESPACE ID LPAREN optional_parameters RPAREN WHITESPACE optional_return_type WHITESPACE LBRACE ENTER statements RBRACE

optional_parameters : has_parameter
                        | empty
has_parameter : has_parameter COMMA has_parameter
                        | ID COL WHITESPACE TYPE

运行 后,我意识到它给了我 1 个 shift/reduce 冲突。仔细检查 parser.out 文件后,

    (27) has_parameter -> has_parameter COMMA has_parameter .
    (27) has_parameter -> has_parameter . COMMA has_parameter

  ! shift/reduce conflict for COMMA resolved as shift

我意识到冲突是因为生产

has_parameter : has_parameter COMMA has_parameter
                        | ID COL WHITESPACE TYPE

此 shift/reduce 冲突的产生是因为如果 has_parameter COMMA has_parameter 当前在堆栈上,解析器(如果在遇到逗号作为下一个符号时)不知道是将其减少到 has_parameter 还是将 COMMA 移到堆栈上。

我尝试过很多不同的方法,比如制作很多不同的作品等,但我不确定是否有有效的方法来消除这种 shift/reduce 冲突。

如有任何帮助,我们将不胜感激。

列表的常用用法是:

parameter_list      : parameter
                    | parameter_list COMMA parameter
parameter           : ID COL WHITESPACE TYPE

对于可选参数列表,您将添加

optional_parameters : parameter_list
                    | empty

没有必要将 parameter 定义为单独的非终结符,尤其是在只有一个关联产生式的情况下。但往往不止一个,多出来的非终结符语法更易读。


顺便说一句,在扫描器中忽略空格通常比尝试在语法中所有可能出现的地方包含它要麻烦得多。 (即使是稍微复杂的语法,尝试显式处理空白通常会导致需要额外的前瞻。)