编译原理词法分析.docx
文本预览下载声明
班级:信1101-2班姓名:徐梦迪学号验一 词法分析一、实验目的 通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。二、实验要求编制一个读单词过程,源程序为一个文件,读取该文件,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、界符五大类。并依次输出各个单词的内部编码及单词符号自身值。单词的内部编码如下:1、保留字:if、int、for、while、do、return、break、continue;单词种别码为1;2、标识符:除保留字外的以字母开头,后跟字母、数字的字符序列;单词种别码为2;3、常数为无符号整形数;单词种别码为3;4、运算符包括:+、-、*、/、=;单词种别码为4;5、分隔符包括:,、;、{、}、(、); 单词种别码为5。三、实验环境:VC++6.0四、实验内容:实验内容是进行词法分析,词法分析器的功能是输入源程序,输出单词符号。词法分析器的单词符号常常表示成以下的二元式(单词种别码,单词符号的属性值)。本实验中,采用的是一类符号一种种别码的方式。2、各类单词的文法标识符→字母字母数字串字母数字串→字母字母数字串|数字字母数字串|ε无符号整数→数字|数字无符号整数运算符→ + | - | * | / | =界符→ , | ; | ( | ) | { | }3、模块结构参照教材图2.5词法分析过程GETSYM。五、实验步骤1、准备(1) 课本有关章节;(2) 编制好程序;(3) 准备多组测试数据。2、程序思路:在词法分析中,自文件头开始扫描源程序字符,一旦发现符合“单词”定义的源程序字符串时,将它翻译成固定长度的单词内部表示,并填入适当的信息表。经过词法分析后,源程序字符串(源程序的外部表示)被翻译成具有等长信息的单词串(源程序的内部表示),并产生两个表格:常数表和标识符表,它们分别包含了源程序中的所有常数和所有标识符。(1) 定义部分:定义常量、变量、数据结构。(2) 初始化:从文件将源程序全部输入到字符缓冲区中。(3) 取单词前:去掉多余空白。(4) 取单词:利用实验一的成果读出单词的每一个字符,组成单词,分析类型。(5) 显示结果。3、设计程序:(1) 模块设计:将程序分成合理的多个模块(函数),每个模块做具体的同一事情。此程序分为三个模块,读单词、取单词与分析单词。(2) 写出(画出)设计方案:模块关系简图、流程图、全局变量、函数接口等。主程序的框图即此试验的过程可以参照课本P18的程序框图,词法分析的框图可以参照课本P19的程序框图,取单词的过程可以参照课本P20的程序框图。(3) 编程时注意编程风格:空行的使用、注释的使用、缩进的使用等。六、实验代码:// 词法分析.cpp : Defines the entry point for the console application.//#include stdafx.h#include iostream#include ctype.h#include fstream#include string.h#include malloc.husing namespace std;ifstreamfp(file.txt,ios::in);charcbuffer;char *key[8]={if,int,for,while,do,return,break,continue}; //保留字,单词种别码为1; char *lableconst[80]; //标识符,单词种别码为2;intconstnum=40; //常数为无符号整形数,单词种别码为3; char *arithmetic[13]={+ , - , * , / , = }; //运算符,单词种别码为4 char *border[6]={ , , ; , { , } , ( , )}; //分隔符包括,单词种别码为5 intlableconstnum=0; intlinenum=1; int search(char searchchar[],intwordtype){ inti=0,t=0;switch (wordtype) {case 1: { for (i=0;i=7;i++) //保留字 {if (strcmp(key[i],searchchar
显示全部