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



这里CR是创建的 SP是空间 RE 被替换 我正在正确获取创建或替换的输出,而不仅仅是创建。谁能说出代码出了什么问题 但是我仍然收到此警告,因此无法正常工作 P.Y:10.5-6:警告:由于冲突,规则在解析器中无用

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

将空格传递给解析器很少是一个好主意。它只会使语法复杂化,提供很少或没有附加价值。

对终端和非终端的名称采用单一约定也是一个好主意。如果您打算对终端使用全部大写(这是正常约定),那么也不要将其用于非终端,例如TPR.此外,使用有意义的名称和文字字符串将使您的语法更具可读性。

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

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

%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)。

两个单词之间必须有一些标点符号,否则它们会被词法分析器识别为单个单词。因此,单词用空格分隔的事实没有意义;如果词法分析器只是像正常情况一样将空格保留为自己,那么冲突就会消失。

最新更新