# **实验 1 词法分析程序分析报告**
## 一、流程分析
### 1.1main()函数流程分析
本流程对实验原本提供的流程进行了一些改动,使得程序可以从文本文件中读入需要进行词法分析的程序,并将词法分析的部分独立出来,置于 scaner.h 和scanner.cpp 中,并统一封装在了 start\_lexical\_analysis () 中。
流程图如图 1 所示。
![](img/Aspose.Words.fdf27a47-02d6-4136-a73a-1de424fdd3ed.001.jpeg)
图 1 词法分析程序的 main()函数流程图main()函数的执行流程如下:
1. 程序开始后,会使用 utils.h 中声明的 load\_program() 函数来接受需要进行词法分析的程序的文本文件 data.txt,将其读入 scaner.cpp 中定义的全局变量 prog[] 字符数组中。
2. 接下来,会使用 utils.h 中声明的 show\_program() 函数来输出读入的程序,方便判断是否完成将程序读入。
3. 调 用 scaner.h 中 声 明 的 start\_lexical\_analysis() 函 数 ,start\_lexical\_analysis()函数会输出对程序的词法分析结果至此,结束程序运行。
而对于 start\_lexical\_analysis()函数而言,不涉及具体的词法分析过程,负责输出 basic\_scaner()词法分析函数的分析结果。执行流程如下:
1. 进入 start\_lexical\_analysis()后,函数会初始化索引变量 p,p 用于记录词法分析所分析 prog[]数组所进行的位置索引。
1. 接下来开始执行 basic\_scaner(),进行词法分析
1. 词法分析完成后,位于 scaner.cpp 中的全局变量 syn 和 token[]均被更新,这时会判断 syn 的值,如果是 11 则表示 syn 为整型数字,则会输出(syn, integer);如果是-‐1 则表示 syn 所分析到得词语是语言中未定义的情况;如果 syn的值为 0,则表示遇到了文件的结束符号 EOF,程序分析完毕;对于其他情况,则会直接输出(syn, token)。
下面是 syn 所表示含义的表格:
|syn|token|syn|token|syn|token|
| :-: | :-: | :-: | :-: | :- | :-: |
|0|EOF|10|标识符|20|<=|
|1|function|11|整形数字|21|=|
|2|If|12||22|==|
|3|Then|13|+|23|!=|
|4|While|14|-‐|24||
|5|do|15|\*|25|,|
|6|End|16|/|26|;|
|7||17|>|27|(|
|8||18|>=|28|)|
|9||19|<|29|{|
|-‐1|未定义|||30|}|
### 1.2 basic\_scaner()函数流程分析
本流程与实验原本提供的逻辑基本一致, 它是 main() 函数流程图中得
basic\_scaner()的内部执行情况的详细描述。流程图如图 2 所示。
![](img/Aspose.Words.fdf27a47-02d6-4136-a73a-1de424fdd3ed.002.jpeg)
图 2 词法分析程序的 basic\_scaner()函数流程图
basic\_scaner()函数的执行流程如下:
1. 函数开始执行后,会读取一个字符,如果它是空格、换行、制表,则会跳过;
1. 如果读到的 ch 是字母或者是下划线,则说明接下来的单词可能是标识符,也可能是关键字;如果发现是关键字,则 syn=n+1,否则为标识符,则 syn=10;
1. 如果读到的 ch 是数字,则继续读后面的数字,直到读到非数字为止,并将读到的数字字符转成整数,使用 int 变量来保存,且 syn=11;
1. 如果读到的 ch 是运算符,则 syn 的值为对应运算符的值;
1. 如果读到的是其他未定义的字符,则 syn 的值为-‐1;
1. 处理回退情况,结束 basic\_scaner()的运行。
## 二、词法分析器的状态转换图
根据实验所提供的源程序没有涉及实现浮点数的识别,所以词法分析器的状态转换图未考虑浮点数情况,如图 3 所示。
![](img/Aspose.Words.fdf27a47-02d6-4136-a73a-1de424fdd3ed.003.jpeg)
图 3 词法分析程序的状态转换图
## 三、调试过程简述
源程序一共出现了下述几个问题:
1. 全局变量过度滥用,没有详细区分函数模块,代码混乱,实验中一共将源代码分离成了 main.cpp, utils.h, utils.cpp, scaner.h, scaner.cpp 五个文件;
1. 源程序 main()函数中,对字符的读取使用的是 prog[++p],这将造成 prog[]数组会浪费掉 prog[0]这一个单元,在 scaner 函数中这种情况依然存在;
1. scanner()最初有描述 while(ch != ‘#’) 出现明显的错误,这会导致直接跳过整个程序串导致让后面的代码只能分析 prog[]数组中的最后一个‘#’字符;
1. 其他位置的代码逻辑基本正确,但由于上述问题的存在导致了解决上面的问题后,还需要对其余的每个部分做细节修改。
## 四、功能扩展描述
本次实验一共扩展了五个功能:
1. 可以识别’{’, ‘}’
2. 修改了关键字 ‘endfunc’ 替换为 ‘end’
2. 当出现 ’\t’ 制表符的时候同样可以跳过
2. 标识符可以使用 ’\_’ 甚至是开头
2. 增加了运算符 ‘-‐>’
# **实验 2 语法分析程序分析报告**
## 一、流程分析
### 1.1 main()函数流程分析
本流程对实验原本提供的流程进行了一些改动,使得程序可以从文本文件中读入需要进行词法分析的程序,并将词法分析的部分独立出来,置于 scaner.h 和scanner.cpp 中,并统一封装在了 start\_lexical\_analysis () 中,而语义分析统一置于parser.h 和 parser.cpp 中 。
流程图如图 1 所示。
![](img/Aspose.Words.f5c5e3c4-75d7-452c-ba82-bb2f0ca1a7f0.001.jpeg)
图 1 语法分析程序的 main()函数流程图
### 1.2 yucu()函数流程分析
yucu()函数用于分析这段文法产生式:
<语句串> -> <语句>;{语句}
流程与分析此段文法产生式流程是一致的,首先会进入 statement()语句分析函数,进而判断是否存在’;’,接下来进一步进行 statement()语句分析,直到判断到没有再出现‘;’为止。
![](img/Aspose.Words.f5c5e3c4-75d7-452c-ba82-bb2f0ca1a7f0.002.jpeg)
图 2 语法分析程序中 yucu()函数流程图
### 1.3 statement()函数流程分析
statement()函数用于分析这段文法产生式:
<语句> -> <赋值语句>
<赋值语句> -> 标识符 = <表达式>
流程与分析此段文法产生式流程是一致的,首先会进入判断当前语句是否存在’=’, 如果存在’=’则对其进行相应的表达式分析。
这是因为,在这两句文法产生式中,’=’前面只可能是标识符,不可能是表达式, 因此,编译器可以对程序串进行依次读取,读取到’=’后,接下来读取的一定是表达式,不需要考虑’=’前面的情况。
![](img/Aspose.Words.f5c5e3c4-75d7-452c-ba82-bb2f0ca1a7f0.003.jpeg)
图 3 语法分析程序的 statement() 函数
### 1.4 expression()函数流程分析
expression()函数用于分析这段文法产生式:
<表达式> -> <项>{+<项> | -‐<项>}
流程与分析此段文法产生式流程是一致的,首先会进入 term()函数分析项的组成部分,然后判断是否出现’+’或’-‐’,如果出现了,则根据文法产生式的规定,后边必然还需要进行项分析,因此进而再次进入 term()进行项分析,重复;如果不存在;则结束表达式分析。
![](img/Aspose.Words.f5c5e3c4-75d7-452c-ba82-bb2f0ca1a7f0.004.jpeg)
图 4 语法分析程序的 expression()函数流程分析
### 1.5 term()函数流程分析
term()函数用于分析这段文法产生式:
<项> -> <因子>{\*<因子> | /<因子>}
流程与分析此段文法产生式流程是一致的,首先会进入 facotr()函数分析因子的组成部分,然后判断是否出现’\*’或’/’,如果出现了,则根据文法产生式的规定, 后边必然还需要进行因子分析,因此进而再次进入 factor()进行项分析,重复;如果不存在;则结束因子分析。这个过程和 expression()的表达式分析是基本一致的。
![](img/Aspose.Words.f5c5e3c4-75d7-452c-ba82-bb2f0ca1a7f0.005.jpeg)
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
《编译原理》课程设计的Training语言的词法、语法、语义分析源代码。 本次实验一共扩展了四个功能: 能够处理某行没有’;’的情况; 能够输出出错语法所在的行数; 详细输出了分析过程,对于能够在一条语句完成时就输出四元式。 修复了源程序的逻辑错误。
资源推荐
资源详情
资源评论
收起资源包目录
100012224-基于C++实现Training语言的词法、语法、语义分析(编译原理实验练习).zip (97个子文件)
compiler_of_training
实验报告
实验3 语义分析程序分析报告.pdf 709KB
实验2 语法分析程序分析报告.pdf 913KB
实验1 词法分析程序分析报告.pdf 614KB
实验要求
3.语义分析程序分析报告写作要求.txt 92B
实验源代码(有错).pdf 1.31MB
1.词法分析程序分析报告写作要求.txt 92B
2.语法分析程序分析报告写作要求.txt 88B
实验要求.pdf 91KB
实验2 - 语法分析
include
scaner.h 868B
parser.h 329B
utils.h 318B
Makefile 386B
src
scaner.cpp 5KB
parser.cpp 6KB
utils.cpp 1KB
data
data0.txt 105B
main.cpp 2KB
report
statement函数流程.graffle 3KB
expression函数流程.jpg 49KB
statement函数流程.jpg 91KB
term函数流程.jpg 49KB
expression函数流程.graffle 3KB
yucu函数流程.graffle 3KB
main函数流程.jpg 147KB
basic_scaner.jpg 228KB
term函数流程.graffle 3KB
实验2 语法分析程序分析报告.docx 873KB
factor函数流程.jpg 151KB
main函数流程.graffle 4KB
factor函数流程.graffle 4KB
实验2 语法分析程序分析报告.pdf 913KB
yucu函数流程.jpg 84KB
basic_scaner.graffle 5KB
LICENSE 18KB
实验3 - 语义分析
include
semantic.h 445B
scaner.h 860B
parser.h 333B
utils.h 376B
Makefile 465B
src
scaner.cpp 5KB
parser.cpp 7KB
utils.cpp 2KB
semantic.cpp 1KB
data
data0.txt 63B
data3.txt 52B
data2.txt 48B
data1.txt 49B
main.three 30KB
main.cpp 2KB
report
newtemp函数流程.jpg 24KB
statement函数流程.graffle 4KB
expression函数流程.jpg 84KB
statement函数流程.jpg 102KB
expression函数流程.graffle 3KB
实验3 语义分析程序分析报告.docx 670KB
yucu函数流程.graffle 3KB
main函数流程.jpg 152KB
实验3 语义分析程序分析报告.pdf 709KB
factor函数流程.jpg 195KB
main函数流程.graffle 4KB
factor函数流程.graffle 5KB
emit函数流程.graffle 2KB
yucu函数流程.jpg 84KB
emit函数流程.jpg 37KB
newtemp函数流程.graffle 2KB
img
Aspose.Words.4ed408b8-17ac-4a75-9e3b-fcc422f10991.005.jpeg 8KB
Aspose.Words.f5c5e3c4-75d7-452c-ba82-bb2f0ca1a7f0.007.jpeg 18KB
Aspose.Words.4ed408b8-17ac-4a75-9e3b-fcc422f10991.004.jpeg 29KB
Aspose.Words.f5c5e3c4-75d7-452c-ba82-bb2f0ca1a7f0.005.jpeg 18KB
Aspose.Words.f5c5e3c4-75d7-452c-ba82-bb2f0ca1a7f0.006.jpeg 27KB
Aspose.Words.4ed408b8-17ac-4a75-9e3b-fcc422f10991.006.jpeg 19KB
Aspose.Words.4ed408b8-17ac-4a75-9e3b-fcc422f10991.003.jpeg 13KB
Aspose.Words.f5c5e3c4-75d7-452c-ba82-bb2f0ca1a7f0.001.jpeg 26KB
Aspose.Words.4ed408b8-17ac-4a75-9e3b-fcc422f10991.002.jpeg 29KB
Aspose.Words.f5c5e3c4-75d7-452c-ba82-bb2f0ca1a7f0.004.jpeg 19KB
Aspose.Words.f5c5e3c4-75d7-452c-ba82-bb2f0ca1a7f0.003.jpeg 23KB
Aspose.Words.4ed408b8-17ac-4a75-9e3b-fcc422f10991.001.jpeg 29KB
Aspose.Words.f5c5e3c4-75d7-452c-ba82-bb2f0ca1a7f0.002.jpeg 32KB
Aspose.Words.fdf27a47-02d6-4136-a73a-1de424fdd3ed.001.jpeg 27KB
Aspose.Words.fdf27a47-02d6-4136-a73a-1de424fdd3ed.003.jpeg 53KB
Aspose.Words.fdf27a47-02d6-4136-a73a-1de424fdd3ed.002.jpeg 22KB
实验1 - 词法分析
include
scaner.h 879B
utils.h 431B
Makefile 316B
src
scaner.cpp 6KB
utils.cpp 1KB
data
data0.txt 247B
main.cpp 2KB
report
状态转换图.jpg 192KB
main函数流程.jpg 125KB
basic_scaner.jpg 191KB
状态转换图.graffle 4KB
main函数流程.graffle 4KB
实验1 词法分析程序分析报告.pdf 614KB
basic_scaner.graffle 5KB
实验1 词法分析程序分析报告.docx 592KB
README.md 16KB
共 97 条
- 1
资源评论
神仙别闹
- 粉丝: 2673
- 资源: 7625
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功