编译原理上机实验

更新时间:2023-10-13 05:33:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

实验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、运算符、分隔符和关键字,词法分析阶段通常被忽略。 各种词法单元对应的词法记号如下: 词法单元 for if then else while do ID NUM 词法记号 1 2 3 4 5 6 10 11 词法单元 + - * / : = < > 词法记号 13 14 15 16 17 18 20 21 词法单元 <= <> >= == ; ( ) # 词法记号 22 23 24 25 26 27 28 0 编写程序,实现词法分析功能。 输入:源程序

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

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主程序示意图

变量初始化 忽略空格

是 是否文件结束? 否 字母 数字 其他

拼字符串 运算符、 符号

界符等符号 拼数 否 是否关键字? 对不同符号给报错 出相应的syn值 syn=10 是 syn为对应关键字的单syn=11 词种别码(词法记号) 返回 返回 图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

实验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

本文来源:https://www.bwwdw.com/article/ygef.html

Top