如何在C中使用LR解析器计算表达式结果

时间:2018-09-29 14:45:52

标签: c parsing lr

我正在编写一个用于使用LR解析器(2个堆栈轨道)计算表达式值的程序。该代码适用于单个数字。它会将0到9之间的两个整数相加或相乘,但对于12 + 5 * 10之类的两位数,它将失败。代码如下。我添加了在评论中检查标记是否为数字的串联双精度数字的逻辑。

dialog.setCanceledOnTouchOutside(false);

2 个答案:

答案 0 :(得分:2)

您遇到的错误比未正确解析的数字严重得多(请参见其他答案)。

您在理解yylexyyparse一起工作时遇到了问题。

解析器调用lex来获取下一个输入令牌并对其进行处理。然后它向lex询问下一个令牌,直到解析器达到ACCEPT状态并返回到调用方(您的主设备)为止。

您首先致电yylex,然后致电yyparse。精细。 Lex获得了第一个令牌,并且应将其放在您的堆栈中。但事实并非如此。因此输入令牌丢失。我也看不到您致电yylex中的yyparse来获取下一个令牌。

我请您纠正错误。它需要做一些我不愿意做的返工和调试。这是你的功课。但是我希望这个提示能帮助您。

并开始学习使用调试器。它显示了程序所采用的路径以及变量的值,因此您可以检查是否发生任何逻辑错误或错误。调试是学习C语言必不可少的一部分。

答案 1 :(得分:0)

else if (isdigit(ch))中,您必须继续读取数字输入,并将其处理为x,例如

ch = input[test++];
...
else if (isdigit(ch))
{
    lk.type = NUMBER;
    x= ch - '0';
    while (isdigit(ch=input[test++]))
        x = x*10 + ch - '0';
}
...
// test++; // remove it here.