警告:规则在解析器中由于冲突而无用

问题描述:

此处CR是创建 SP是空格 RE被替换 iam正确地获取输出,但不是仅用于创建。任何人都可以请告诉什么是错的代码 但亚姆仍然收到这样的警告,因此不工作 潘岳:10.5-6:警告:解析器规则无用,由于冲突警告:规则在解析器中由于冲突而无用

%token CR TRI SP RE OR BEF AFT IOF INS UPD DEL ON OF 
    %% 
    s:e '\n' { printf("valid variable\n");f=1; }; 
    e:TPR SP TRI; 
    TPR:CR 
    |CR SP OR SP RE; 
+0

为什么要将空格传递给解析器? – rici

这是很少传递一个好主意空格解析器。它只会使语法复杂化,很少或没有额外的价值。

对终端和非终端的名称采用单一约定也是一个好主意。如果您打算为终端使用ALL CAPS(这是常规惯例),则不要将其用于非终端,如TPR。而且,使用有意义的名称和文字字符串将使您的语法更具可读性。

“规则在解析器中由于冲突无用”警告总是伴随着一个或多个shift/reduce或reduce/reduce冲突。通常情况下,解决方案是解决冲突。在这种情况下,您可以通过简单地将空白传递给解析器来实现。

这里是你的语法,我想:(我猜你的意思的缩写)

%token CR "create" OR "or" RE "replace" 
%token TABLE_IDENTIFIER 
%% 
statement: expr '\n' { /* Some action */ } 
expr: table_producer TABLE_IDENTIFIER 
table_producer 
    : "create" 
    | "create" "or" "replace" 

写这样一来,没有空格,语法没有任何冲突。如果我们重新引入了空白:

%token CR "create" OR "or" RE "replace" 
%token TABLE_IDENTIFIER SPACE 
%% 
statement: expr '\n' { /* Some action */ } 
expr: table_producer SPACE TABLE_IDENTIFIER 
table_producer 
    : "create" 
    | "create" SPACE "or" SPACE "replace" 

然后有一个转变/减少冲突create被识别之后。前瞻将是SPACE,但解析器无法知道该SPACE是第二个table_producer生产(create or...)还是expr生产(create table_name)的一部分。

两个单词之间必须有一些标点符号,否则会被词法分析器识别为单个单词。所以单词之间用空格分隔的事实是没有意义的;如果词法分析器简单地将空白保留给自己,那么冲突就会消失。