上传者: y949170228
|
上传时间: 2025-12-16 21:18:04
|
文件大小: 363KB
|
文件类型: DOC
编译原理 词法及语法
通过编写和调试一个词法分析程序,掌握在对程序设计语言的源程序进行扫描的过程中,将字符流形式的源程序转化为一个由各类单词符号组成的流的词法分析方法。
通过设计、编制、调试一个典型的语法分析程序(任选一种有代表性的语法分析方法,如算符优先法、递归下降法、LL(1)、SLR(1)、LR(1)等,作为编制语法分析程序的依据),对扫描器所提供的单词序列进行语法检查和结构分析,实现并进一步掌握常用的语法分析方法。
### 编译原理实验报告知识点总结
#### 实验一:词法分析程序实现
##### 实验设计
**实验目的与要求**
- 掌握词法分析的基本原理与方法。
- 学会如何将源程序中的字符流转换为一系列有意义的单词符号。
**基本实验题目**
- 构造一个词法分析程序,能够识别以下特定语言中的词汇单元:
- 五个关键字:`begin`, `end`, `if`, `then`, `else`
- 标识符:以字母开头的字母数字串
- 无符号常数
- 六种关系运算符:<, <=, =, <>, >, >=
- 赋值符 := 和四种算术运算符:+, -, *, /
**实验步骤**
1. **单词的分类与编码**:定义一个单词符号及其分类码表,如上所述的表格。
2. **有限状态自动机(DFA)的设计**:构建用于识别单词的DFA,如图I所示。每个状态代表单词识别的一个阶段。
3. **语义变量及函数**:定义必要的辅助函数和变量来支持词法分析的过程:
- **GETCHAR**:获取下一个字符。
- **TOKEN**:用于存储当前正在识别的单词的字符序列。
- **CAT**:向TOKEN追加字符。
- **LOOKUP**:查找关键字表,确定单词类别。
- **RETRACT**:将扫描指针回退一个字符。
- **OUT**:输出识别完成的单词及其类别。
**扩展无符号常数的处理**
- 使用右线性文法G1[<无符号数>]来描述无符号常数的结构。
- 构建状态转换图(如图II所示)来辅助识别过程。
- 在识别过程中,根据状态矩阵(如表II所示)逐步转换字符串形式的无符号数为内部表示形式(二进制整数或浮点数)。
**基本思路**
- 关键字识别通过查询关键字表实现。
- 无符号整数识别需将数字串转化为浮点数FCON。
- 主程序入口为`t_main()`函数,负责打开文件`file.txt`,调用`scanner`函数对文本进行扫描,并使用`out()`函数输出识别结果。
**流程图**
- **主程序流程图**:从打开文件到调用词法分析器,再到输出结果的完整过程。
- **扫描子程序流程图**:展示如何逐一处理输入字符,识别单词,并输出其类别。
---
#### 实验二:语法分析程序实现
##### 实验设计
**实验目的与要求**
- 设计并实现一个语法分析器,能够检查由词法分析器提供的单词序列是否符合给定语言的语法规则。
- 学习并应用一种语法分析方法,例如算符优先法、递归下降法、LL(1)、SLR(1)、LR(1)等。
**实验步骤**
1. **选择一种语法分析方法**:根据实验要求选择合适的分析算法。
2. **设计文法**:定义目标语言的上下文无关文法。
3. **构造分析器**:基于所选分析方法构建语法分析器。
4. **测试与调试**:通过测试数据集验证语法分析器的有效性和正确性。
**基本思路**
- 选择一种适合的语法分析方法,比如LL(1)或LR(1)。
- 设计具体的上下文无关文法规则来描述目标语言的语法结构。
- 构建相应的语法分析器,可以是递归下降解析器或者基于表驱动的分析器。
- 编写测试用例来验证语法分析器的准确性。
**流程图**
- **整体流程图**:从接收词法分析器输出到进行语法检查,再到输出结果的全过程。
- **具体分析子程序流程图**:展示如何使用选定的语法分析方法处理输入的单词序列。
---
### 总结
本实验旨在深入理解编译原理中的词法分析与语法分析两个重要环节。通过亲手编写和调试词法分析程序和语法分析程序,不仅掌握了词法分析的基本技术,还学会了如何运用不同的语法分析方法来构建有效的语法分析器。这些实践经历对于深入理解高级编程语言的内部工作机制具有重要意义。此外,通过本实验还能增强解决实际问题的能力,提升编程技巧和调试能力。