《海南大学编译原理实验四》是海南大学计算机相关课程中的一次实践教学环节,学生通过具体编程任务加深对编译原理的理解和应用。
掌握算符优先分析的基本原理及其程序设计与实现的技术方法。
编写识别由下列文法所定义的表达式的算符优先分析程序。
E -> E + T | E - T | T
T -> T * F | TF | F
F -> (E) | i
输入:从键盘或文本段落件中读取含有一个或多个表达式,其中包含任意十进制数和十六进制数,并以#结束。例如:“80-5H+(6+1)+4h2#”。
输出:分析成功与否的信息。
### 知识点详解
#### 1. 算符优先分析原理
算符优先分析是一种自底向上的语法解析方法,适用于大多数算术表达式的处理。这种方法根据操作数之间的优先级来决定何时执行归约操作。
- **算符优先关系**:
- 在文法的任何推导过程中存在 `αAβ` 形式直接短语时,对于所有在非终结符 A 的 FIRSTVT 集合中的算符 x 和 LASTVT 集合中的算符 y,都有相应的优先级。
- 例如,在给定的文法规则中:
```plaintext
E -> E + T | E - T | T
```
`FIRSTVT(E) = {+, -, (, i}`,`LASTVT(E) = {+, -, ), #}`。
- **算符优先表构造**:
算符优先表用于存储不同操作符之间的优先关系。对于两个操作符 x 和 y:
- 如果x > y,则在表格中记录为1;如果x = y,记录0;若x < y, 记录为-1。
- 示例文法中的算符优先表如下所示:
```
+ - * i ( ) #
+> > < < > >
-> > < < > >
*< > = =
i> > > >=
(< << <<< <=
)> >> >>> >=>
#<<<<<<=
```
#### 2. 文法规则及输入输出规则
- **文法定义**:
- `E -> E + T | E - T | T`
- `T -> T * F | TF|F`
- `F -> (E) | i`
其中,非终结符包括:表达式(E)、项(T)和因子(F),算术操作符有+、- 和*;括号为( ) ;变量i代表整数。
- **输入格式**:
- 输入可以是键盘直接输入的字符串或每行含有一个表达式的文本段落件。
- 每个输入串以 `#` 结束,例如:80-5H+(6+1)+4h2#
- 支持十进制和十六进制数(后缀为大写 H 或小写字母 h)。
- **输出格式**:
- 输出表明是否成功解析输入的表达式。
- 成功时,返回“分析成功”;失败则显示 “分析不成功”。
#### 3. 源代码分析
- 定义了一系列变量和宏定义(如 `_CRT_SECURE_NO_WARNINGS`)来避免警告消息。
- 使用二维数组 `table[8][8]` 来存储算符优先关系。
- 函数 `transfer` 根据当前栈顶元素与输入字符计算优先级。
#### 4. 实验总结
通过此实验,学生可以掌握算符优先分析的基本原理及其程序设计实现技术。特别是如何构造和使用操作数的优先表以及将文法规则应用于特定编程任务中(如编写识别给定语法定义表达式的代码)。这对于理解编译器的工作机制非常重要。