我正在编写一个解析器,并且执行一些错误消息来检查。
但是当我进入
而(index <= n && index> 0)做...
我的语法很好。
但是根据我的跟踪,运行此行代码的过程,
它先跟踪表达式:index> 0,然后跟踪表达式&&表达式,
最后一个将是第一个表达式(index <= n)。但是为什么呢?
首先检查索引<= n,然后检查索引> 0,是否正确,最后一个是表达式&& expression?
在一种情况下就可以了。
例如:while(index <= n)do
但如果是综合条件,那就出问题了。
这是我的部分代码
expr: expr LE expr
{<br/>
Trace("expression <= expression");
if ($1->type != $3->type) yyerror("type not match");
if ($1->type != intType && $1->type != realType) yyerror("operator error");
idInfo *info = new idInfo();
info->attribute = 2; //variable type
info->type = boolType;
$$ = info;
}<br/>
|expr AND expr
{
Trace("expression && expression");
if ($1->type != $3->type) yyerror("type not match");
if ($1->type != boolType) yyerror("operator error");
idInfo *info = new idInfo();
info->attribute = 2; //variable type
info->type = boolType;
$$ = info;
}
|expr GG expr
{<br/>
Trace("expression > expression");
if ($1->type != $3->type) yyerror("type not match");
if ($1->type != intType && $1->type != realType) yyerror("operator error");
idInfo *info = new idInfo();
info->attribute = 2; //variable type
info->type = boolType;
$$ = info;
}
这些是我追踪的结果。...
而
'('
ID:索引
<=
ID:n
&&
ID:索引
'>'
整数:0
')'
第16行:表达式> expression
行:16个表达式&&表达式
行:16个类型不匹配
行:16个操作员错误
行:16个表达式<=表达式
行:16个类型不匹配
答案 0 :(得分:0)
您的precedence declarations不正确或丢失。
实际上看不到它们,因此很难提供更多信息,但是看起来您所有的运算符都具有相同的优先级和正确的关联性。
如果您收到有关解析冲突的警告,那么如果您提到该事实,那将很有用(甚至更好地解决了该问题)。
使用Bison的内置跟踪工具总是比尝试自己做要好。 Bison的功能更全面,更准确,并且工作量更少。请参阅Bison手册中的Debugging your Parser部分。