没有合适的资源?快使用搜索试试~ 我知道了~
词法分析 语法分析 语义分析 过程等详细资料
资源详情
资源评论
资源推荐
1 问题的提出
编译器设计的编译程序涉及到编译五个阶段中的三个,即词法分析器、语
法分析器和中间代码生成器。编译程序的输出结果包括词法分析后的二元式序
列、变量名表、状态栈分析过程显示及四元式序列程序。整个编译程序分为三
部分:词法分析部分、语法分析处理及四元式生成部分、输出显示部分。
编译程序需要在单词级别上来分析和翻译源程序,所以首先要识别出单词,
而词法分析部分的任务是:从左至右扫描源程序的字符串,按照词法规则(正
则文法规则)识别出一个个正确的单词,并转换成该单词相应的二元式(种别
码、属性值)交给语法分析使用。因此,词法分析是编译的基础。执行词法分
析的程序称为词法分析器。
语法分析是编译程序的核心部分,其主要任务是确定语法结构,检查语法错误,
报告错误的性质和位置,并进行适当的纠错工作。
语法分析中主要以二元式作为输入部分,所以输出显示部分的任务是将二
元式通过 分析表对语法分析处理过程进行控制,使四元式翻译的工作有条
不紊的进行,同时识别语法分析中的语法错误。
1.1 词法分析器设计
词法分析是编制一个读单词的过程,从输入的源程序中,识别出各个具有
独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并
依次输出各个单词的内部编码及单词符号自身值。程序语言的单词符号一般分
为五种:关键字(保留字基本字)、、;标识符:常量名、变
量名…;常数:、、、‘、…;运算符:、、、、〈 、
、、…、;界限符:, ; ( ) ! 。
词法分析器的功能是输入源程序,输出单词符号。词法分析器的单词符号
常常表示成以下的二元式"单词种别码,单词符号的属性值#。例如源程序为 $
语言。输入如下一段:
%"#
1
&'&'()
"*&#
(&)
+ (&)
!
要求输出:
(,,“%-) (,“(”) (,“)”)
(,”.) (/,”-) (,,”-)
(,”&-) (,”-) (,”'-)
(,,”-) (,”&-) (,”-)
(,”'-) (,,”(-) (,”)-)
(/,”-) (,”(“) (,,”-)
(,”*&-) (,,”-) (,”)“)
(,,”(-) (,”&-) (,,”-)
(,”-) (,,”-) (,”)-)
(/,”+-) (,,”(-) (,”&-)
(,,”-) (,”-) (,,”-)
(,”)-) (,”!.)
识别单词:掌握单词的构成规则很重要,而大多数程序设计语言的单词符
2
0 1
2
字母
字母或数字
其它
识别标识符的转换图
号都可以用下列状态转换图来识别。
/// 词法分析器的设计方法
词法分析器的设计方法有如下四个步骤:
/写出该语言的词法规则。
,把词法规则转换为相应的状态转换图。
把各转换图的初态连在一起,构成识别该语言的自动机。
设计扫描器;把扫描器作为语法分析的一个过程,当语法分析需要一个
单词时,就调用扫描器。扫描器从初态出发,当识别一个单词后便进入终态,
送出二元式。
0
1
2
数字
数字
其它
识别整数的转换图
3
词法分析需要一个单词时,扫描器取单词的程序流程图如下:
//, 词法分析器的输出形式
词法分析器输出的单词符号常常表示为二元式:(单词种别,单词符号的
属性值)
0单词种别通常用整数编码。
0标识符一般统归为一种。常数按类型(整、实、布尔等)分种。关键字
可视其全体为一种,也可以一字一种。采用一字一种的分法实际处理起来较为
方便。运算符可采用一符一种的方法。至于界符一般也采用一符一种的分法。
// 核心代码及其功能
12 3+43
12 32563
12 3+3
12 3+3
定义一个全局变量,一个全局指针
开始
读标识符
是字母
查保留字表
是否查到
换成属性字
结束
是数字 是特殊符号
error
取数
换成属性字
换成属性字 换成属性字
Y
N
Y
Y
Y
N
N
N
4
789 6) 6 是一个指向 789 类型结构的指针变量,可以使 6 指向某一个文件
的结构变量,从而通过该结构体变量中的文件信息访问该文件
) 标志变量,用来标识各类型的 8:
主函数
; %"#
自定义函数的声明
2 2<)
2 662++"2 <#)
2 62++"2 <#)
2 62++"2 <#)
""6&6"34%623'33##&&=># 以 只 读 方 式 打 开 文
件34%623,=> 在 + 文件中已被定义为 ?
6"33#)
+
2<&2"6#) 文件不为空则从文件中取字符
"2<@&9A7# 9A7 文件结束标志
"2<&&B BCC2<&&BDB# 掠过空格和回车符
2<&2"6#)
&)
!
+
"+6"2<##
2<&662++"2<#) 检查 2< 是否为字母,
是则调用 662++"#函数
+
"+"2<##
2<&62++"2<#) 检查 2< 是否为数字 ?
~E,是则调用 62++"#函数
+ 2<&62++"2<#) 非上 述两者 则 调用
62++"#函数
!
!
!
主函数结束
处理读取字符为字母的情况
2 662++"2 <#
+2"2 +22FG' 56#) 函数声明
56)
&/)
5
剩余29页未读,继续阅读
jila58590420
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0