编译原理实验-词法分析器的设计与实现
- 格式:doc
- 大小:444.50 KB
- 文档页数:28


编译原理词法分析实验报告
一, 题目
编制C语言子集的词法分析程序
二, 实验目的
通过设计、编制、调试一个具体的词法分析程序,加深对词法分析原理的理解,并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。
三, 实验要求
1.根据具体情况,由同学们自己选取C语言的一个适当大小的子集(可取一类典型单词,也可以尽可能使各种类型的单词都兼顾到),如课本表2.1;在上机前一定要制出相应的表。
2.程序功能
输入:字符串。
输出:二元式(种别编码,单词自身)构成的序列。
举例:
输入:a=$;#
输出:(6,a)
(12,=)
FOUND ERROR
(13,;)
四, 步骤
1.定义单词表
2.完善词法分析器程序
(1)定义变量、函数
(2)增加程序的输入、输出
3.程序验证
C语言子集的单词符号及内码值
单词符号 种别码 助记符 内码值
while 1 while -- if 2 if --
else 3 else --
switch 4 switch --
case 5 case --
标识符 6 id id在符号表中的位置
常数 7 num num在常数表中位置
+ 8 + --
- 9 - --
* 10 * --
<= 11 relop LE
< 11 relop LT
== 11 relop EQ
= 12 = --
; 13 ; --
词法分析程序的功能
输入:所给文法的源程序字符串。
输出:二元组(syn,token)构成的序列。
其中:typenum为单词种别码;
token为单词缓冲区;
五, 源程序代码:
#include
#include
#include
#define _KEY_WORD_END "waiting fou your expanding"/*定义关键字的结束标志*/
typedef struct
{
int typenum; /*种别码*/
编译原理实验一
编译原理实验一是一个非常重要的实验环节,它涉及到一些基本的编译原理知识和实践技能。在这个实验中,我们将学习如何设计并实现一个简单的词法分析器。
在编译原理实验一中,我们将首先学习词法分析的基本概念和原理。词法分析是编译器的第一阶段,它的主要任务是将输入的源代码分解成一个个的词法单元,如标识符、关键字、数字、运算符等。为了完成这个任务,我们需要设计一个适用于特定编程语言的词法分析器。
接下来,我们将学习如何使用正则表达式来描述词法单元的模式。通过定义正确的正则表达式,我们可以准确地识别出源代码中的各种词法单元。为了实现这一功能,我们将使用一个常用的正则表达式引擎,如lex工具。
在实验过程中,我们将根据给定的编程语言规范,编写相应的正则表达式规则,并通过lex工具生成对应的词法分析器程序。然后,我们将使用这个词法分析器程序来对一些示例源代码进行分析,确保它能正确地识别出各种词法单元。
最后,我们将对实验结果进行总结和分析。通过实验一,我们将更深入地了解词法分析的原理和实现方法,为以后更复杂的编译原理实验和项目打下坚实的基础。希望大家能够认真对待这个实验,积极探索和学习,并尽可能多地掌握相关知识和技能。
计算机与信息工程学院实验报告
姓名:_ _学号: 专业:_软件工程 年级:_2017_
课程: 编译原理 主讲教师: _ 辅导教师:
实验时间:2020年 5月28日上午8时至10时,实验地点:201_
实验题目: 实验:词法分析
实验目的: 通过实现PL/0语言(一种示例小语言)的词法分析器,理解词法分析过程,掌握程序各部分之间的接口安排。
实验环境(硬件和软件) Code Blocks
实验内容:
1、PL/0语言的单词结构
关键字(10个):begin, end ,if ,then, while, do, const,
var,call,procedure
标识符:字母序列,最大长度10
常数:整型常数
算符和界符(17个):+, -, *,/,odd,=,<>,<,>,<=,>=,:=,(,) ,, ,.,;
2、单词的种别划分
标识符 作为一种
常数 作为一种
算符和界符每个单词作为一个单独种别 3、PL/0的语言的词法分析器将要完成以下工作:
(1) 跳过分隔符(如空格,回车,制表符);
(2) 识别诸如begin,end,if,while等保留字;
(3) 识别非保留字的一般标识符。
(4) 识别数字序列。
(5) 识别:=,<=,>=之类的特殊符号。
4、词法分析器的实现方式:
把词法分析器设计成一个独立子程序,以便于语法分析器调用。词法分析器运行一次产生一个单词符号。
5、词法分析器的输出形式
(种别,属性值)
其中:种别在“2、单词的种别”中进行了定义;
属性值:若单词种别只代表唯一单词,属性值为空;
若单词种别是SYM_IDENTIFIER,属性值为该单词在标识符表中的位置;
编译原理实验报告
实验一 词法分析设计
一、实验功能:
1、对输入的txt文件内的内容进行词法分析:
2、由文件流输入test.txt中的内容,对文件中的各类字符进行词法分析
3、打印出分析后的结果;
二、程序结构描述:(源代码见附录) 1、分别利用k[],s1[],s2[],s3[]构造关键字表,分界符表,算术运算符表和关系运算符表。
2、 bool isletter(){} 用来判断其是否为字母,是则返回true,否则返回false;
bool isdigit(){} 用来判断其是否为数字,是则返回true,否则返回false;
bool iscalcu(){} 用来判断是否为算术运算符,是则返回true,否则返回false;
bool reserve(string a[]){} 用来判断某字符是否在上述四个表中,是则返回true,否则返回false;
void concat(){} 用来连接字符串;
void getn(){} 用来读取字符;
void getb(){} 用来对空格进行处理;
void retract(){} 某些必要的退格处理;
int analysis(){} 对一个单词的单词种别进行具体判断;
在主函数中用switch决定输出。
三、实验结果
四、实验总结
词法分析器一眼看上去很复杂,但深入的去做就会发现并没有一开始想象的那么困难。对于一个字符的种别和类型可以用bool函数来判断,对于关键字和标示符的识别(尤其是3b)则费了一番功夫,最后对于常数的小数点问题处理更是麻烦。另外,这个实验要设定好时候退格,否则将会导致字符漏读甚至造成字符重复读取。
我认为,这个实验在程序实现上大体不算困难,但在细节的处理上则需要好好地下功夫去想,否则最后的程序很可能会出现看上去没有问题,但实际上漏洞百出的状况。
将学过的知识应用到实际中并不简单,只有自己不断尝试将知识转化成程序才能避免眼高手低,对于知识的理解也必将更加深刻。