Bison:由于冲突,规则在解析器中无效[-Wother]
Bison: rule useless in parser due to conflicts [-Wother]
我有这个语法,它应该从java代码中生成java字节码。我知道这个警告以前已经在很多问题中得到了解决,但我找不到类似的问题。它显示了这两个规则的警告,特别是:
statement_list:
{
$<stmt_type>$.next = $<stmt_type>0.next;
}
statement
|
{
$<stmt_type>$.next = strdup(genLabel().c_str()); //generate label for statement and assign it to statement list next
}
statement_list
{
$<stmt_type>$.next = $<stmt_type>0.next;
fout<<$<stmt_type>1.next<<":"<<endl; //mark statement with statement list next label
}
statement
;
还有这个
b_expression:
expression RELA_OP expression
{$$ = $<bexpr_type>0;relaCast(string($2),$$.nTrue,$$.nFalse);}
|{/* addding some strings to this action */ } b_expression BOOL_OP b_expression
在解析每个语句以在代码生成中使用它之前,我需要在这里用下一个语句标记它。当我从statement_list中删除语义操作时,它的错误就消失了,但我没有对b_expression进行同样的尝试。
Bison只向前看1个令牌来决定应用哪个生产。您的两个production for语句在解析器已经读取了任何令牌,以知道要应用哪个产品。
如果您直接在yacc规则中生成带有标签的类似程序集的堆栈代码,您通常会使用以下内容:
if_statement: IF condition {
$$ = gen_label();
gen_code(JUMP_FALSE, $$); }
THEN block {
$$ = gen_label();
gen_code(JUMP, $$);
gen_code(LABEL, $3); }
ELSE block {
gen_code(LABEL, $6); }
while_statement: WHILE { gen_code(LABEL, $$ = gen_label()); }
condition { gen_code(JUMP_FALSE, $$ = gen_label); }
block { gen_code(JUMP, $2); gen_code(LABEL, $4); }
如果你直接生成字节码,你就没有"标签"——当你生成正向分支时,你会记住字节码中目标偏移应该去的地方,当你到达要输出标签的地方时,你就会对分支进行回溯,跳到当前位置。
相关文章:
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 无法访问嵌套类.类的使用无效
- 如果用户输入无效,如何使用字符串变量-C++重复输入命令
- 如何解决错误:SCIP C++中的 SCIP 阶段无效 <10>
- 在没有参数列表的情况下使用模板名称"Event"无效,模板问题
- FFMPEG配置文件级别id大小无效
- 错误:从"int"到枚举c++的转换无效
- 如何修复此错误:className::className的无效使用
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- C++-模板嵌套类的引用初始化无效
- 错误:无效的预处理指令 #i 的意思是 #if?
- 多维数组 C++ 中数组下标的类型"int[int]"无效
- 在 C++ 中使用正则表达式错误时出现问题 括号表达式中的范围无效
- 从 'int' 到 'int*' CPP 的转换无效
- 如何接受 [ENTER] 键作为无效输入并发送错误消息
- 由于无效的 ValidateRgn() 子窗口不会收到WM_PAINT消息
- C++ PTHREADS - 无效转换无效*(*)()到无效*(*)(无效*)
- 声明为无效的变量或字段'...' Ardunio 编译器上的错误
- 数组下标的类型"float*[float]"无效
- Bison:由于冲突,规则在解析器中无效[-Wother]