编译原理上机实验

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验1简单的词法分析子程序
【实验目的】
●理解词法分析在编译程序中的作用
●初步了解和掌握词法分析程序的实现方法和技术
【实验内容】
1. 编写程序,输入一串字符,判断该字符串是否为合法标识符或合法整型常量。

2. 无符号数的算术四则运算中的各类单词的识别。

输入:由无符号数、+、-、*、/、(、)构成的算术表达式。

输出:对识别出的每一单词均单行输出。

如,输入:
8*2.5-1.0e2
则,输出:
8
*
2.5
-
1.0e2
描述无符号数的确定的、最小化的状态转换图如图1所示。

其中编号1,2和6为终态,分别代表整数、小数和科学计数的识别结束状态。

图1 文法G[<无符号数>]的状态转换图
实验2词法分析程序设计
【实验目的】
●理解词法分析中的正规式和自动机
●掌握词法分析程序的实现方法和技术
【实验内容】
某一高级程序设计语言的部分语言子集定义如下:
(1)关键字:
for if then else while do
(所有关键字都是小写)
(2)运算符和分隔符:
+ - * / : = <><= <>>= == ; ( ) #
(3)其他标识符(ID)和整型常数(NUM),通过以下正规式定义:
ID=letter(letter|digit)*
NUM=digit·digit*
(4)空格由空白、制表符和换行符组成。

空格一般用来分隔ID、NUM、运算符、分隔符和关键字,词法分析阶段通常被忽略。

各种词法单元对应的词法记号如下:
编写程序,实现词法分析功能。

输入:源程序
输出:二元组(词法记号,属性值/其在符号表中的位置)构成的序列。

例如:输入源程序
x=5;
if (x>0)then
x=2*x+1/3;
else
x=2/x;
#
(# 表示输入结束)经词法分析后输出如下序列:(10,x)
(18,=)
(11,5)
(26,;)
(2,if)
(27,()

说明:关键字表的初值。

关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别出标识符,查关键字表。

如能查到匹配的单词,则该单词的关键字,否则为一般标识符。

关键字表为一个字符串数组,其描述如下:char *keyword[6]={”for”,”if”,”then”,”else”,”while”,”do”};
图2-1主程序示意图
图2-2 扫描子程序主要部分流程图
实验3语法分析程序设计
【实验目的】
●理解语法分析在编译程序中的作用
●在词法分析的基础上进行语法检查和结构分析
●掌握语法分析程序的实现方法和技术
【实验内容】
某一高级程序设计语言的部分语法规则用扩充的BNF表示如下:
⑴ <程序>::=begin<语句串>end
⑵ <语句串>::=<语句>{;<语句>}
⑶ <语句>::=<赋值语句>
⑷ <赋值语句>::=ID=<表达式>
⑸ <表达式>::=<项>{+<项> | -<项>}
⑹ <项>::=<因子>{*<因子> | /<因子>}
⑺ <因子>::=ID | NUM | (<表达式>)
要求:输入单词串,以“#”结束,如果是文法正确的句子,则输出“success”,否则输出“error”。

例如:
输入begin a=9; x=2*3; b=a+x end #
输出success!
输入x=a+b*c end #
输出error!
实验4语义分析及中间代码生成程序设计
【实验目的】
●理解语义分析及中间代码生成在编译程序中的作用
●在语法分析的基础上进行语义检查并生成中间代码
●加深对语法制导翻译的理解
●掌握将语法分析所识别的语法成分变换为中间代码的语义翻译方法
【实验内容】
某一高级程序设计语言的部分词法、语法规则同以上实验,在实验3语法分析程序基础上,设计和实现该语言的语义分析程序。

要求:输入是一段语句串,输出为三地址指令形式的四元式代码
例如:
对于语句串
Begin a=2+3*4; x=(a+b)/c end #
输出的三地址码为:
t1 = 3*4
t2 = 2+t1
a = t2
t3 = a + b
t4 = t3/c
x = t4。

相关文档
最新文档