警告:规则在解析器中由于冲突而无用
问题描述:
此处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;
答
这是很少传递一个好主意空格解析器。它只会使语法复杂化,很少或没有额外的价值。
对终端和非终端的名称采用单一约定也是一个好主意。如果您打算为终端使用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
)的一部分。
两个单词之间必须有一些标点符号,否则会被词法分析器识别为单个单词。所以单词之间用空格分隔的事实是没有意义的;如果词法分析器简单地将空白保留给自己,那么冲突就会消失。
为什么要将空格传递给解析器? – rici