%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;。但我的似乎是正确的。
答案 0 :(得分:2)
globalrule
是不可满足的,因为它的所有作品都是递归的。因此globalrule
的任何扩展都需要包含在内。这是不可能的,因此bison
会丢弃globalrule
的所有作品,然后正确地注意到其他规则无法访问。
此外,不要在每个替代方案的末尾加上分号;你应该只在一个非终端的最后一个替代品的末尾添加一个分号(即便如此,它是可选的,但对读者很有用)。
最后,我不知道你想要做什么,但通常忽略词法分析器中的注释而不是将它们推送到解析器,因为这会使语法复杂化或限制注释可以去的地方,或两者兼而有之。