我在为if / else开发语法规则时遇到问题....如果有人能解释我做错了什么,那就太好了
/* Terminal symbols */
%token <string> TINTEGER
%token <token> TLBRACE TRBRACE TSEMI TLPAREN TRPAREN
%token <token> TMAIN TROTATE TFORWARD THUMAN TZOMBIE TATTACK TIF TELSE
/* Statements */
%type <block> main_loop block
%type <statement> statement rotate forward if else attack insideStatement
/* Expressions */
%type <numeric> numeric
%type <boolean> bool
%%
main_loop : TMAIN TLBRACE block TRBRACE { std::cout << "Main entry point found!" << std::endl; }
;
block : statement { std::cout << "Single statement" << std::endl; }
| block statement {std::cout<<"Multiple statements" <<std::endl;}
;
statement : rotate TSEMI
| forward TSEMI
| if
| attack TSEMI
;
if : TIF TLPAREN bool TRPAREN insideStatement
| TIF TLPAREN bool TRPAREN else
| statement
;
else :TELSE TLBRACE block TRBRACE{std::cout << "Else" << std::endl;}
;
insideStatement : TLBRACE block TRBRACE else
;
它编译,但我真的不明白if / else如何在Bison上运行..
答案 0 :(得分:3)
这些规则:
statement : if ;
if : statement ;
是循环的并且使你的语法模棱两可,所以你需要摆脱其中一个(可能是if : statement ;
规则。
您的其他规则等同于:
if : TIF '(' bool ')' '{' block '}' TELSE '{' block '}'
| TIF '(' bool ')' TELSE '{' block '}'
;
也就是说,你需要总是有一个其他的,但你可能没有“真正的”阻止,这似乎是倒退。 else
和insideStatement
规则只是服务器来模糊这里的内容。
一般来说,单个字符代币使用单个字符代码比使用代码的名称更清晰......