为什么这会使yacc/bison中的冲突发生1次转移/减少

为什么这会使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

我想解析从/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_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。