实验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 表示如下: ⑴ ::=beginend ⑵ ::={;} ⑶ ::=
⑷ ::=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