为什么这会使yacc/bison中的冲突发生1次转移/减少
我想解析从/etc/hosts.allow格式派生的简单语法。 我在yacc上得到了一个转换/减少冲突。我是否可以忽略换档/减少冲突警告,或以某种方式对其进行修改为什么这会使yacc/bison中的冲突发生1次转移/减少,bison,yacc,shift-reduce-conflict,Bison,Yacc,Shift Reduce Conflict,我想解析从/etc/hosts.allow格式派生的简单语法。 我在yacc上得到了一个转换/减少冲突。我是否可以忽略换档/减少冲突警告,或以某种方式对其进行修改 %token ALLOW %token DENY %token COMMENT %token DEFAULT %token HOSTUSER %token PRODUCT %% lines: line | lines line line: product_line | default_line product_li
%token ALLOW
%token DENY
%token COMMENT
%token DEFAULT
%token HOSTUSER
%token PRODUCT
%%
lines: line
| lines line
line: product_line
| default_line
product_line: PRODUCT ':' user_host_list ':' allow_deny
{ printf("product line\n"); }
default_line: DEFAULT ':' allow_deny
{ printf ("default line\n"); }
allow_deny: ALLOW
| DENY
user_host_list:
| HOSTUSER
| user_host_list HOSTUSER
%%
#include <stdio.h>
extern FILE *yyin;
extern char *yytext;
main(argc, argv)
int argc;
char **argv;
while(yyparse() && !feof(yyin))
;
return 0;
}
您的用户\u主机\u列表定义:
user_host_list:
| HOSTUSER
| user_host_list HOSTUSER
从一个你可能不想做的开始。它包含3条规则。第一个规则是空的,因此空令牌序列可以简化为用户\主机\列表。这是导致冲突的不必要的减少
如果您打算要求至少1个HOSTUSER,请按以下方式编写:
# comments
# comments
DEFAULT : DENY
<some_product_code> : <list_of_users_hosts> : ALLOW
<some_product_code> : <list_of_users_hosts> : ALLOW
user_host_list:
HOSTUSER
| user_host_list HOSTUSER
user_host_list:
/* empty */
| user_host_list HOSTUSER
如果您打算允许一个空列表,请这样写:
# comments
# comments
DEFAULT : DENY
<some_product_code> : <list_of_users_hosts> : ALLOW
<some_product_code> : <list_of_users_hosts> : ALLOW
user_host_list:
HOSTUSER
| user_host_list HOSTUSER
user_host_list:
/* empty */
| user_host_list HOSTUSER
谢谢当我不允许host_user为空时,我在第一个product_行上得到一个语法错误,错误的标记是[:]。我还将lexer添加到了我的Operator中,您的lexer实际上从未返回HOSTUSER。