Bison IF/ELSE语法规则

Bison IF/ELSE语法规则,bison,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

我在为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

 ;
/*终端符号*/
%代币染色机
%令牌TLBRACE TRBRACE TSEMI TLPAREN TRPAREN
%token TMAIN TROTATE TFORWARD THUMAN TZOMBIE TATTACK TIF TELSE
/*声明*/
%类型主回路块
%type语句如果有其他攻击,则向前旋转insideStatement
/*表情*/
%键入数字
%类型布尔
%%
main_loop:TMAIN TLBRACE block TRBRACE{std::cout这些规则:

statement : if ;
if : statement ;
是循环的,会使语法模棱两可,因此需要去掉其中一个(可能是
if:statement;
规则)

您的其他if规则等同于:

if : TIF '(' bool ')' '{' block '}' TELSE '{' block '}'
   | TIF '(' bool ')' TELSE '{' block '}'
   ;
也就是说,您需要始终有一个else,但您可能没有“true”块,它看起来是向后的。
else
insideStatement
规则只是为了掩盖这里发生的事情

一般来说,将单字符标记用于单字符标记比为标记命名更为清晰。

这些规则:

statement : if ;
if : statement ;
是循环的,会使语法模棱两可,因此需要去掉其中一个(可能是
if:statement;
规则)

您的其他if规则等同于:

if : TIF '(' bool ')' '{' block '}' TELSE '{' block '}'
   | TIF '(' bool ')' TELSE '{' block '}'
   ;
也就是说,您需要始终有一个else,但您可能没有“true”块,它看起来是向后的。
else
insideStatement
规则只是为了掩盖这里发生的事情

一般来说,将单字符标记用于单字符标记比为标记命名更为清晰