Bison IF / ELSE语法规则

时间:2013-05-10 20:08:52

标签: bison

我在为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上运行..

1 个答案:

答案 0 :(得分:3)

这些规则:

statement : if ;
if : statement ;

是循环的并且使你的语法模棱两可,所以你需要摆脱其中一个(可能是if : statement ;规则。

您的其他规则等同于:

if : TIF '(' bool ')' '{' block '}' TELSE '{' block '}'
   | TIF '(' bool ')' TELSE '{' block '}'
   ;

也就是说,你需要总是有一个其他的,但你可能没有“真正的”阻止,这似乎是倒退。 elseinsideStatement规则只是服务器来模糊这里的内容。

一般来说,单个字符代币使用单个字符代码比使用代码的名称更清晰......