野牛致命错误

时间:2014-05-08 13:24:35

标签: bison

%union {char *str; tree_t *t;}
%token<str> floating dig dig1 var cmnt path path1 web ERROR
%token equal lbrack rbrack semicolon rbrack1 newline newline1 creturn quote bkslash  bkslash2 bkslashq global host
%type<t> globalrule openrule hostrule openrule1 keyrule valuerule

%start globalrule
%%

globalrule: 

     global openrule { cur->next = (tree_t *)malloc(sizeof(tree_t));  cur=cur->next;   cur->var_id= "";cur->var_name="GLOBAL"; cur->var_value="";cur->next=0; };

   | newline globalrule {};

   | cmnt globalrule {};


openrule:

     lbrack keyrule { };

   | lbrack newline keyrule {cur->next = (tree_t *)malloc(sizeof(tree_t));  cur=cur->next;   cur->var_id= "";cur->var_name="GLOBAL"; cur->var_value="";cur->next=0;};

   | lbrack newline newline keyrule { cur->next = (tree_t *)malloc(sizeof(tree_t));  cur=cur->next;   cur->var_id= "";cur->var_name="GLOBAL"; cur->var_value="";cur->next=0;};

   | lbrack newline newline newline keyrule { cur->next = (tree_t *)malloc(sizeof(tree_t));  cur=cur->next;   cur->var_id= "";cur->var_name="GLOBAL"; cur->var_value="";cur->next=0; };

   | cmnt openrule {};

   | newline openrule {};

我得到了致命的错误:

bison -d grammar.y
grammar.y: warning: 7 nonterminals useless in grammar
grammar.y: warning: 30 rules useless in grammar
grammar.y:18.8-17: fatal error: start symbol globalrule does not derive any sentence
make: *** [grammar.tab.o] Error 1

我不明白出了什么问题。我看过上一篇文章,其中有人失踪了&#34; |&#34;。但我的似乎是正确的。

1 个答案:

答案 0 :(得分:2)

globalrule是不可满足的,因为它的所有作品都是递归的。因此globalrule的任何扩展都需要包含在内。这是不可能的,因此bison会丢弃globalrule的所有作品,然后正确地注意到其他规则无法访问。

此外,不要在每个替代方案的末尾加上分号;你应该只在一个非终端的最后一个替代品的末尾添加一个分号(即便如此,它是可选的,但对读者很有用)。

最后,我不知道你想要做什么,但通常忽略词法分析器中的注释而不是将它们推送到解析器,因为这会使语法复杂化或限制注释可以去的地方,或两者兼而有之。