Postfix后缀表达式实验报告

来源:互联网 发布:上海php培训机构 编辑:程序博客网 时间:2024/05/29 13:17

实验目的

通过使用一个Java语言编写的能将算术表达式翻译为等价后缀形式的语法制导翻译器,对语言处理程序有一个初步的认识。


实验环境

jdk1.8; Eclipse neon


实验过程

  • 将类 Parser 的成员 lookahead 声明为 static 或 non static,不会影响该程序的正确性,因为在本程序中,对 lookahead 所有操作都在类内进行。将 lookahead 声明为 static,可能和后期对 Parser 的拓展相关。

  • 尾递归出现在 rest() 中,因为这个尾递归不传递任何参数,所以直接用一个while循环让它跳转回本函数第一行即可。消除尾递归之后的函数 rest()如下:

    void rest() {while (true) {        if (lookahead == '+') {            match('+');            term();            System.out.write('+');            continue;        } else if (lookahead == '-') {            match('-');            term();            System.out.write('-');            continue;        }         break;    }}
    对比 时间复杂度 空间复杂度 尾递归 O(n) O(n) 循环 O(n) O(1)
  • 拓展错误处理功能
    在term() & rest()中如果出现字符集{0|1|2|3|4|5|6|7|8|9|0|+|-}之外的字符,那便是词法错误。若出现缺少运算符,缺少运算量等,就是语法错误。我定义了两个int变量用于记录这个输入串的运算量个数和运算符个数,当应该匹配到运算量却只有运算符时,便输出哪个运算符缺少运算量,并跳过这个运算符,从而继续向下分析。当应匹配运算符却匹配到运算量时,输出哪两个运算量缺少运算符,并跳过这个运算量,继续向下分析。

  • 第三个问题关键在于,怎么具体的描述出每个不同的问题,我觉得很多情况是有二异的,比如说+2这个表达式,究竟是因为表达式不能以符号开头而错还是因为第一个运算符缺乏左运算量呢?这就比较主观了。包括后面我做的ErroRecovery,我选择的是将不符合的lookahead skip掉,这也是我个人的观点。

    这里写图片描述
    应匹配到'+' '-' 时,只有 ),因为这不是字符集成员,所以是词法错误,lookahead向后移一位,遇到 2 ,那么运算量 1 和 2 之间没有合法的运算符,为了继续向下分析,将 2 去掉,遇到 '-',说明运算量 1 是减号的左运算量, 运算量 3 是右运算量。

    这里写图片描述
    在运算量 1 和 2 之间应存在运算符,但因为没有,所以去掉运算量 2 ,继续分析。

    这里写图片描述
    在运算符'+'后面存在一个空格,词法错误。然后去掉这个空格继续向下分析。

    这里写图片描述
    表达式一开始应匹配到运算量,所以直接去掉开始的运算符继续向下分析。

    这里写图片描述

    这里写图片描述

原创粉丝点击