c - 匹配yacc中的类似规则
问题描述
在 yacc+lex 程序中,使用 yacc 文件中的这些规则(以及更多规则),
stmt : ';'
| expr ';' { /*code*/ }
| IF '(' expr ')' stmt { /*code*/ }
| IF '(' expr ')' stmt ELSE stmt { /*code*/ }
.
.
.
.
如果输入是这样的:
if(1<2) {return 5;}
作为 "(1<2)" 一个 expr 和 "{return 5}" 一个 stmt,它匹配。否则,如果输入类似于:
if(1<2) {return 5;} else {return 2;}
它不匹配...
我尝试改变 ELSE 和 IF 的关联性......它说“语法错误”。
编辑1:
expr 定义为:
expr : ID '=' expr { emit(dup); emit2(istore, $1->localvar); }
| ID PA expr { emit2(iload, $1->localvar); emit(iadd); emit(dup); emit2(istore, $1->localvar); }
| ID NA expr { emit2(iload, $1->localvar); emit(isub); emit(dup); emit2(istore, $1->localvar); }
| ID TA expr { emit2(iload, $1->localvar); emit(imul); emit(dup); emit2(istore, $1->localvar); }
| ID DA expr { emit2(iload, $1->localvar); emit(idiv); emit(dup); emit2(istore, $1->localvar); }
| ID MA expr { emit2(iload, $1->localvar); emit(irem); emit(dup); emit2(istore, $1->localvar); }
| expr EQ expr { emit3(if_icmpeq, 7); emit(iconst_0); emit3(goto_, 4); emit(iconst_1); }
| expr NE expr { emit3(if_icmpne, 7); emit(iconst_0); emit3(goto_, 4); emit(iconst_1); }
| expr '<' expr { emit3(if_icmplt, 7); emit(iconst_0); emit3(goto_, 4); emit(iconst_1); }
| expr '>' expr { emit3(if_icmpgt, 7); emit(iconst_0); emit3(goto_, 4); emit(iconst_1); }
| expr LE expr { emit3(if_icmple, 7); emit(iconst_0); emit3(goto_, 4); emit(iconst_1); }
| expr GE expr { emit3(if_icmpge, 7); emit(iconst_0); emit3(goto_, 4); emit(iconst_1); }
| expr '+' expr { emit(iadd); }
| expr '-' expr { emit(isub); }
| expr '*' expr { emit(imul); }
| expr '/' expr { emit(idiv); }
| expr '%' expr { emit(irem); }
| '(' expr ')'
| '$' INT8 { emit(aload_1); emit2(bipush, $2); emit(iaload); }
| ID { emit2(iload, $1->localvar); }
| INT8 { emit2(bipush, $1); }
| INT16 { emit3(sipush, $1); }
| INT32 { emit2(ldc, constant_pool_add_Integer(&cf, $1)); }
| FLT { error("float constant not supported in Pr3"); }
| STR { error("string constant not supported in Pr3"); }
;
解决方案
在 yacc 脚本中,我将 if 语句定义如下:
if_statement : IF b_expr
statement
else_part
;
else_part : ELSE
statement
| empty
;
推荐阅读
- javascript - 尽管我在控制台记录了它并且没有显示错误,但我的附加似乎不起作用(新手问题)
- python - 合并包含列表对象的 Pandas 列
- mysql - 获取与 MAX 列关联的其他列
- javascript - KnockoutJS:显示 HTML - 填充 HTML
- html - 如何让 div 填满整个屏幕(砌体/Pinterest)布局
- php - 在客户端遍历多维数组数据时,在 php 中填充模板视图的最简洁方法是什么?
- c# - UWP 将 IF 语句转换为 NavigationViewItems 的 foreach 循环
- c# - 异步读取图像文件
- c - printf 的问题 - 不打印 put 整数值
- r - 表格不在 Rmd 笔记本中编织和打印?