Bison IF/ELSE语法规则
我在为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
/* 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
规则只是为了掩盖这里发生的事情
一般来说,将单字符标记用于单字符标记比为标记命名更为清晰