词法分析器

词法分析器
词法分析器

中北大学软件学院

实验报告

专业

课程名称

学号

姓名

辅导教师成绩

6、状态转换图及词法分析程序

(1)标识符(ID)和整型常数(NUM)的正规式如下:

ID = _ | letter (letter | digit)*

NUM = digit digit*

其中标识符的状态转换图为:

其词法分析程序为:if(((ch>='A')&&(ch<='Z'))||((ch>='a')&&(ch<='z'))||(ch=='_'))

{ /*以字母开头*/

while(((ch>='A')&&(ch<='Z'))||((ch>='a')&&(ch<='z'))||(ch

=='_')||((ch>='0')&&(ch<='9')))

{

array[i++]=ch;

ch=fgetc(fpin);

}

word=(char *)malloc((i+1)*sizeof(char));

memcpy(word,array,i);

word[i]='\0';

is_id_key(word);

if(ch!=EOF)

fseek(fpin,-1L,SEEK_CUR);

}

常数的状态转换图为:

其词法分析程序为:

else if(ch>='0'&&ch<='9')

{ /*以数字开头*/

while(ch>='0'&&ch<='9')

{

array[i++]=ch;

ch=fgetc(fpin);

}

word=(char *)malloc((i+1)*sizeof(char));

is_number(word,array,i);

word[i]='\0';

cs_manage(word);

if(ch!=EOF)

fseek(fpin,-1L,SEEK_CUR);

}

(2)实验流程图

7、测试及结果

8、心得

7、测试及结果

8、心得

词法分析器的实现与设计

题目:词法分析器的设计与实现 一、引言................................ 错误!未定义书签。 二、词法分析器的设计 (3) 2.1词的内部定义 (3) 2.2词法分析器的任务及功能 (3) 3 2.2.2 功能: (4) 2.3单词符号对应的种别码: (4) 三、词法分析器的实现 (5) 3.1主程序示意图: (5) 3.2函数定义说明 (6) 3.3程序设计实现及功能说明 (6) 错误!未定义书签。 7 7 四、词法分析程序的C语言源代码: (7) 五、结果分析: (12) 摘要:词法分析是中文信息处理中的一项基础性工作。词法分析结果的好坏将直接影响中文信息处理上层应用的效果。通过权威的评测和实际应用表明,IRLAS是一个高精度、高质量的、高可靠性的词法分析系统。众所周知,切分歧义和未登录词识别是中文分词中的两大难点。理解词法分析在编译程序中的作用,加深对有穷自动机模型的理解,掌握词法分析程序的实

现方法和技术,用c语言对一个简单语言的子集编制一个一遍扫描的编译程序,以加深对编译原理的理解,掌握编译程序的实现方法和技术。Abstract:lexical analysis is a basic task in Chinese information processing. The results of lexical analysis will directly affect the effectiveness of the application of Chinese information processing. The evaluation and practical application show that IRLAS is a high precision, high quality and high reliability lexical analysis system. It is well known that segmentation ambiguity and unknown word recognition are the two major difficulties in Chinese word segmentation. The understanding of lexical analyse the program at compile, deepen of finite automata model for understanding, master lexical analysis program implementation method and technology, using C language subset of a simple language compilation of a scanned again compiler, to deepen to compile the principle solution, master compiler implementation method and technology. 关键词:词法分析器?扫描器?单词符号?预处理 Keywords: lexical analyzer word symbol pretreatment scanner 一、引言 运用C语言设计词法分析器,由指定文件读入预分析的源程序,经过词法分析器的分析,将结果写入指定文件。本程序是在Visual?Studio环境下,使用C语言作为开发工具。基于实验任务

编译原理 简单样本语言的词法分析器

昆明理工大学信息工程与自动化学院学生实验报告 (2012 —2013 学年第 1 学期) 课程名称:编译原理开课实验室:信自楼44 年月日 一、实验目的及内容 设计、编制、调试一个词法分析子程序-识别单词,加深对词法分析原理的理解。 二、实验原理及基本技术路线图(方框原理图或程序流程图) 对给定的程序通过词法分析器弄够识别一个个单词符号,并以二元式(单词种别码,单词符号的属性值)显示。而本程序则是通过对给定路径的文件的分析后以单词符号和文字提示显示。 三、所用仪器、材料(设备名称、型号、规格等或使用软件) W INDOWS下的VISUAL C++6.0; 四、实验方法、步骤(或:程序代码或操作过程) #include #include using namespace std;

#define MAX 22 char ch =' '; string key[15]={"begin","end","if","then","else","while","write","read", "do", "call","const","char","until","procedure","repeat"}; int Iskey(string c){ //关键字判断 int i; for(i=0;i='a'))||((c<='Z')&&(c>='A'))) return 1; else return 0; } int IsDigit(char c){ //判断是否为数字 if(c>='0'&&c<='9') return 1; else return 0; } void analyse(FILE *fpin){ string arr=""; while((ch=fgetc(fpin))!=EOF) { arr=""; if(ch==' '||ch=='\t'||ch=='\n'){} else if(IsLetter(ch)){ while(IsLetter(ch)||IsDigit(ch)) { if((ch<='Z')&&(ch>='A')) ch=ch+32; arr=arr+ch; ch=fgetc(fpin); } fseek(fpin,-1L,SEEK_CUR); if (Iskey(arr)){cout<

实验一、词法分析器(含源代码)

词法分析器实验报告 一、实验目的及要求 本次实验通过用C语言设计、编制、调试一个词法分析子程序,识别单词,实现一个C语言词法分析器,经过此过程可以加深对编译器解析单词流的过程的了解。 运行环境: 硬件:windows xp 软件:visual c++6.0 二、实验步骤 1.查询资料,了解词法分析器的工作过程与原理。 2.分析题目,整理出基本设计思路。 3.实践编码,将设计思想转换用c语言编码实现,编译运行。 4.测试功能,多次设置包含不同字符,关键字的待解析文件,仔细察看运行结果,检测该分析器的分析结果是否正确。通过最终的测试发现问题,逐渐完善代码中设置的分析对象与关键字表,拓宽分析范围提高分析能力。 三、实验内容 本实验中将c语言单词符号分成了四类:关键字key(特别的将main说明为主函数)、普通标示符、常数和界符。将关键字初始化在一个字符型指针数组*key[]中,将界符分别由程序中的case列出。在词法分析过程中,关键字表和case列出的界符的内容是固定不变的(由程序中的初始化确定),因此,从源文件字符串中识别出现的关键字,界符只能从其中选取。标识符、常数是在分析过程中不断形成的。 对于一个具体源程序而言,在扫描字符串时识别出一个单词,若这个单词的类型是关键字、普通标示符、常数或界符中之一,那么就将此单词以文字说明的形式输出.每次调用词法分析程序,它均能自动继续扫描下去,形成下一个单词,直到整个源程序全部扫描完毕,从而形成相应的单词串。 输出形式例如:void $关键字

流程图、程序流程图:

程序: #include #include #include #include //定义关键字 char *Key[10]={"main","void","int","char","printf","scanf","else","if","return"}; char Word[20],ch; // 存储识别出的单词流 int IsAlpha(char c) { //判断是否为字母 if(((c<='z')&&(c>='a'))||((c<='Z')&&(c>='A'))) return 1; else return 0; } int IsNum(char c){ //判断是否为数字 if(c>='0'&&c<='9') return 1; else return 0; } int IsKey(char *Word){ //识别关键字函数 int m,i; for(i=0;i<9;i++){ if((m=strcmp(Word,Key[i]))==0) { if(i==0) return 2; return 1; } } return 0; } void scanner(FILE *fp){ //扫描函数 char Word[20]={'\0'}; char ch; int i,c; ch=fgetc(fp); //获取字符,指针fp并自动指向下一个字符 if(IsAlpha(ch)){ //判断该字符是否是字母 Word[0]=ch; ch=fgetc(fp);

C++实现词法分析器

#include #include using namespace std; char inchar[80], token[8]; char character; int zbbm, p, m = 0, n, row, sum = 0; char *blz[6] = { "while", "if", "else", "switch", "case" }; void input() { for (n = 0; n<8; n++) token[n] = NULL; character = inchar[p++]; while (character == ' ') { character = inchar[p]; p++; } if ((character >= 'a'&&character <= 'z') || (character >= 'A'&&character <= 'Z')) { m = 0; while ((character >= '0'&&character <= '9') || (character >= 'a'&&character <= 'z') || (character >= 'A'&&character <= 'Z')) { token[m++] = character; character = inchar[p++]; } token[m++] = '\0'; p--; zbbm = 6; for (n = 0; n<5; n++) if (strcmp(token, blz[n]) == 0) { zbbm = n + 1; break; } } else if ((character >= '0'&&character <= '9')) { { sum = 0; while ((character >= '0'&&character <= '9')) { sum = sum * 10 + character - '0'; character = inchar[p++]; } } p--; zbbm = 7; if (sum>32767) zbbm = -1; } else switch (character) { case'<':m = 0; token[m++] = character; character = inchar[p++]; if (character == '=') { zbbm = 11; token[m++] = character; }

词法分析器实验报告

词法分析器实验报告 词法分析器设计 一、实验目的: 对C语言的一个子集设计并实现一个简单的词法分析器,掌握利用状 态转换图设计词法分析器的基本方法。利用该词法分析器完成对源程 序字符串的词法分析。输出形式是源程序的单词符号二元式的代码, 并保存到文件中。 二、实验内容: 1. 设计原理 词法分析的任务:从左至右逐个字符地对源程序进行扫描,产生一个个单词符号。 理论基础:有限自动机、正规文法、正规式 词法分析器(Lexical Analyzer) 又称扫描器(Scanner):执行词法分析的程序 2. 词法分析器的功能和输出形式 功能:输入源程序、输出单词符号 程序语言的单词符号一般分为以下五种:关键字、标识符、常数、运算符,界符 3. 输出的单词符号的表示形式: 单词种别用整数编码,关键字一字一种,标识符统归为一种,常数一种,各种符号各一种。 4. 词法分析器的结构 单词符号 5. 状态转换图实现

三、程序设计 1.总体模块设计 /*用来存储目标文件名*/ string file_name; /*提取文本文件中的信息。*/ string GetText(); /*获得一个单词符号,从位置i开始查找。并且有一个引用参数j,用来返回这个单词最后一个字符在str的位置。*/ string GetWord(string str,int i,int& j); /*这个函数用来除去字符串中连续的空格和换行 int DeleteNull(string str,int i); /*判断i当前所指的字符是否为一个分界符,是的话返回真,反之假*/ bool IsBoundary(string str,int i); /*判断i当前所指的字符是否为一个运算符,是的话返回真,反之假*/ bool IsOperation(string str,int i);

编译原理实验报告一 简单样本语言的词法分析器

理工大学信息工程与自动化学院学生实验报告 (2012 —2013学年第一学期) 一、实验目的及容 编译技术是理论与实践并重的课程,而其实验课要综合运用所学的多门课程的容,用来完成一个小型编译程序。从而巩固和加强对词法分析、语法分析、语义分析、代码生成和报错处理等理论的认识和理解;培养学生对完整系统的独立分析和设计的能力,进一步培养学生的独立编程能力。 调试并完成一个词法分析程序,加深对词法分析原理的理解。 二、实验原理及基本技术路线图(框原理图或程序流程图) 1、待分析的简单语言的词法 (1)关键字: begin if then while do end 所有关键字都是小写。 (2)运算符和界符: := + –* / < <= <> > >= = ; ( ) #

(3)其他单词是标识符(ID)和整型常数(NUM),通过以下正规式定义:ID=letter(letter| digit)* NUM=digit digit * (4)空格由空白、制表符和换行符组成。空格一般用来分隔ID、NUM,运算符、界符和关键字,词法分析阶段通常被忽略。 2、各种单词符号对应的种别码 3、词法分析程序的功能 输入:所给文法的源程序字符串。 输出:二元组(syn,token或sum)构成的序列。 其中:syn为单词种别码; token为存放的单词自身字符串; sum为整型常数。 二、所用仪器、材料(设备名称、型号、规格等或使用软件)

1台PC以及VISUAL C++6.0软件。 三、实验法、步骤(或:程序代码或操作过程) (1)程序代码: #include #include #include char prog[80],token[8]; char ch; int syn,p,m=0,n,row,sum=0; char *rwtab[6]={"begin","if","then","while","do","end"}; void scaner() { for(n=0;n<8;n++) token[n]=NULL; ch=prog[p++]; while(ch==' ') { ch=prog[p]; p++; } if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) { m=0; while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) { token[m++]=ch; ch=prog[p++]; } token[m++]='\0'; p--; syn=10; for(n=0;n<6;n++)

简单词法分析器

简单词法分析器 1、将源文件中的单词识别出来,以用'$'为首的标识符标记识别出的单词 2、单词符号及内部表示如表: 单词符号种别编码助记符内码值 DIM 1 $DOM — IF 2 $IF — DO 3 $DO — STOP 4 $STOP — END 5 $END — 标识符 6 $ID 内部字符串 常数7 $INT 标准二进制形式= 8 $ASSIGN — + 9 $PLUS — * 10 $STAR — ** 11 $POWER — ; 12 $SEMICOLON — { 13 $LBRACE — } 14 $RBRACE — /* * 词法分析:将源文件中的单词符号一一识别 * 并将其与助记符保存到文本文件 */ #include "iostream" #include "string" using namespace std; //reserve保留字 string reserve[5] = {"DIM","IF","DO","STOP","END"}; //结构体数组,保存已识别的单词 struct table { string str; string name; }table[400]; int count = 0; //判断是否为保留字

bool Reserve(string str) { bool flag = false; for(int i=0; i>filename; if((fp = fopen(filename,"r")) == NULL) { cout<<"file not found"<

词法分析器(C语言版)

/********************************************** *名称:词法分析器 *版本:1.0 *作者:** *2015/4/2 ************************************************/ #include #include #include #include #include #define LENGTH1 10//type reserved word size FILE * fp=NULL;//outstream Pointer FILE * fw=NULL;//instream pointer char character; char token[32]; //The character array to store the sequence of characters, has been read. //Code table char * CODE[]={"identifier","constant","keyword","+","-","*","/",">","<",">=","<=","!=","=","==", "(",")","[","]","{","}","&","||","!",",",";",".",":","\"","%","#","\'"}; //key word table char *k[]={"for","while","do","go","to","switch","if","else","int","float","char","static","break", "exit","continu","error"}; //标识符结构体 typedef struct { char * I[256]; //标识符数组 int len;//标识符数量 } identifier; //常量结构体 typedef struct { int cont[300];//存放常量的数组 int len;//常量的数目 } constnumber; //读入一个字符,从输入流中读入一个字符到变量character中。 void getNextChar(FILE *ifp)

编译原理课程设计报告C语言词法与语法分析器的实现

编译原理课程设计报告 课题名称:编译原理课程设计 C-语言词法与语法分析器的实现

C-词法与语法分析器的实现 1.课程设计目标 (1)题目实用性 C-语言拥有一个完整语言的基本属性,通过编写C-语言的词法分析和语法分析,对于理解编译原理的相关理论和知识有很大的作用。通过编写C-语言词法和语法分析程序,能够对编译原理的相关知识:正则表达式、有限自动机、语法分析等有一个比较清晰的了解和掌握。(2)C-语言的词法说明 ①语言的关键字: else if int return void while 所有的关键字都是保留字,并且必须是小写。 ②专用符号: + - * / < <= > >= == != = ; , ( ) [ ] { } /* */ ③其他标记是ID和NUM,通过下列正则表达式定义: ID = letter letter* NUM = digit digit* letter = a|..|z|A|..|Z digit = 0|..|9 注:ID表示标识符,NUM表示数字,letter表示一个字母,digit表示一个数字。 小写和大写字母是有区别的。 ④空格由空白、换行符和制表符组成。空格通常被忽略。 ⑤注释用通常的c语言符号/ * . . . * /围起来。注释可以放在任何空白出现的位置(即注释不能放在标记)上,且可以超过一行。注释不能嵌套。

(3)程序设计目标 能够对一个程序正确的进行词法及语法分析。 2.分析与设计 (1)设计思想 a.词法分析 词法分析的实现主要利用有穷自动机理论。有穷自动机可用作描述在输入串中识别模式的过程,因此也能用作构造扫描程序。通过有穷自动机理论能够容易的设计出词法分析器。b.语法分析 语法分析采用递归下降分析。递归下降法是语法分析中最易懂的一种方法。它的主要原理是,对每个非终结符按其产生式结构构造相应语法分析子程序,其中终结符产生匹配命令,而非终结符则产生过程调用命令。因为文法递归相应子程序也递归,所以称这种方法为递归子程序下降法或递归下降法。其中子程序的结构与产生式结构几乎是一致的。 (2)程序流程图 程序主流程图: 词法分析: 语法分析:

编译原理实验报告(词法分析器语法分析器)

编译原理实验报告

实验一 一、实验名称:词法分析器的设计 二、实验目的:1,词法分析器能够识别简单语言的单词符号 2,识别出并输出简单语言的基本字.标示符.无符号整数.运算符.和界符。 三、实验要求:给出一个简单语言单词符号的种别编码词法分析器 四、实验原理: 1、词法分析程序的算法思想 算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。 2、程序流程图 (1 (2)扫描子程序

3

五、实验内容: 1、实验分析 编写程序时,先定义几个全局变量a[]、token[](均为字符串数组),c,s( char型),i,j,k(int型),a[]用来存放输入的字符串,token[]另一个则用来帮助识别单词符号,s用来表示正在分析的字符。字符串输入之后,逐个分析输入字符,判断其是否‘#’,若是表示字符串输入分析完毕,结束分析程序,若否则通过int digit(char c)、int letter(char c)判断其是数字,字符还是算术符,分别为用以判断数字或字符的情况,算术符的判断可以在switch语句中进行,还要通过函数int lookup(char token[])来判断标识符和保留字。 2 实验词法分析器源程序: #include #include #include int i,j,k; char c,s,a[20],token[20]={'0'}; int letter(char s){ if((s>=97)&&(s<=122)) return(1); else return(0); } int digit(char s){ if((s>=48)&&(s<=57)) return(1); else return(0); } void get(){ s=a[i]; i=i+1; } void retract(){ i=i-1; } int lookup(char token[20]){ if(strcmp(token,"while")==0) return(1); else if(strcmp(token,"if")==0) return(2); else if(strcmp(token,"else")==0) return(3); else if(strcmp(token,"switch")==0) return(4); else if(strcmp(token,"case")==0) return(5); else return(0); } void main() { printf("please input string :\n"); i=0; do{i=i+1; scanf("%c",&a[i]);

简单的词法分析器设计

《编译原理》 课程设计院系 专业 年级 11级 学号 姓名 2014年 05月 实验一简单的词法分析器设计 一、设计内容 熟悉并实现一个简单的词法分析器 二、设计目的 了解高级语言单词的分类,了解如何识别单词规则,掌握状态图到识别程序的编程。 源程序中,存在许多编辑用的符号,她们对程序逻辑功能无任何影响。例如:回车,换行,多余空白符,注释行等。在词法分析之前,首先要先剔除掉这些符号,使得词法分析更为简单。 三、实验步骤 1、 将每个单词符号进行不同类别的划分。单词符号可以划分成5中。 (1)标识符:用户自己定义的名字,常量名,变量名与过程名。 (2)常数:各种类型的常数。 (3) 保留字(关键字):如if、begin、then、while、do等。 (4) 运算符:如+、-、*、<、>、=等。

(5)界符:如逗号、分号、括号等。 2、 将所有合法的单词符号转化为便于计算机处理的二元组形式:(单词分类号,单词自身值);以图形化界面显示出来。 3、 可选择性地将结果保存到文件中。 四、概要设计 1.待分析的简单语言的词法 (1)关键字:while do relop letter id number所有关键字都就是小写。 (2)运算符与界符: : = + –* / < <= <> > >= = ; ( ) # (3)其她单词就是标识符(ID)与整型常数(NUM),通过以下正规式定义: 如课本P20例2、6 空格由空白、制表符与换行符组成。空格一般用来分隔ID、NUM,运算符、界符与关键字,词法分析阶段通常被忽略。 2.词法分析器的结构 图6、1 词法分析器的结构 3.部分单词的正规式与状态转换图

编译原理实验-词法分析器的设计与实现.docx

南华大学 计算机科学与技术学院实验报告 (2018~2019学年度第二学期) 课程名称编译原理 实验名称词法分析器的设计与 实现 姓名学号 专业班级 地点教师

1.实验目的及要求 实验目的 加深对词法分析器的工作过程的理解;加强对词法分析方法的掌握;能够采用一种编程语言实现简单的词法分析程序;能够使用自己编写的分析程序对简单的程序段进行词法分析。 实验要求 1.对单词的构词规则有明确的定义; 2.编写的分析程序能够正确识别源程序中的单词符号; 3.识别出的单词以<种别码,值>的形式保存在符号表中,正确设计和维护 符号表; 4.对于源程序中的词法错误,能够做出简单的错误处理,给出简单的错误 提示,保证顺利完成整个源程序的词法分析; 2.实验步骤 1.词法分析规则 <标识符>::=<字母>|<标识符><字母>|<标识符><数字> <常数>::=<数字>|<数字序列><数字> <数字序列>::=<数字序列><数字>|<数字>|<.> <字母>::=a|b|c|……|x|y|z <数字>::=0|1|2|3|4|5|6|7|8|9 <运算符>::=<关系运算符>|<算术运算符>|<逻辑运算符>|<位运算符>|<赋值运算符> <算数运算符>::=+|-|*|/|...|-- <关系运算符>::=<|>|!=|>=|<=|== <逻辑运算符>::=&&| || |! <位运算符>::=&| | |! <赋值运算符>::==|+=|-=|/=|*= <分界符>::=,|;|(|)|{|}|:| // |/**/ <保留字>::=main|if|else|while|do|for|...|void

词法分析器含完整源码

词法分析实验报告 一、实验目的与要求: 1、了解字符串编码组成的词的涵,感觉一下字符串编码的方法和解读 2、了解和掌握自动机理论和正规式理论在词法分析程序和控制理论中的应用 二、实验容: 构造一个自己设计的小语言的词法分析器: 1、这个小语言能说明一些简单的变量 识别诸如begin,end,if,while等保留字;识别非保留字的一般标识符(有下划线、字符、数字,且第一个字符不能是数字)。识别数字序列(整数和小数);识别:=,<=,>=之类的特殊符号以及;,(,)等界符。 2、相关过程(函数): Scanner()词法扫描程序,提取标识符并填入display表中 3、这个小语言有顺序结构的语句 4、这个小语言能表达分支结构的语句 5、这个小语言能够输出结果 总之这个小语言词法分析器能提供以上所说明到的语法描述的功能…… 三、实验步骤: 1、测试评价 (1)、测试1:能说明一些简单的变量,如关键字、一般标识符、界符等; (2)、测试2:能输出结果:单词符号(码形式)、各种信息表(如符号表、常量表等);(3)、测试程序: var x,y,z; begin x:=2; y:=3; if (x+5>=y*y) then begin z:=y*y-x; z:=z+x*x; end else z:=x+y;

prn z; end. (4)、结果: ①、从键盘读入; 部分结果如下:

(类型:该标识符所属的类型,如关键字,变量等;下标:该标识符所对应表(如变量标识符表,常量标识符表等)中其相应的位置,下同) ②、从文件读入,输出到文件; 部分结果如下:

其他测试及结果如下:

编译原理_词法分析器_实验报告

词法分析器实验报告

实验目的: 设计、编制、调试一个词法分析子程序-识别单词,加深对词法分析原理的理解。 功能描述: 该程序要实现的是一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error!”,然后跳过错误部分继续进行) 设计思想: 设计该词法分析器的过程中虽然没有实际将所有的状态转移表建立出来,但是所用的思想是根据状态转移表实现对单词的识别。首先构造一个保留字表,然后,每输入一个字符就检测应该进入什么状态,并将该字符连接到d串后继续输入,如此循环,最后根据所在的接受状态以及保留字表识别单词。 符号表: 记号类别属性值 ws - - const 保留字 1 var 保留字 1 call 保留字 1 begin 保留字 1 if 保留字 1 while 保留字 1 do 保留字 1 odd 保留字 1 end 保留字 1 then 保留字 1 procedure 保留字 1 = 运算符 2 < 运算符 2 <= 运算符 2 <> 运算符 2 > 运算符 2 >= 运算符 2

* 运算符 2 + 运算符 2 - 运算符 2 / 运算符 2 := 运算符 2 ident 标识符 3 number 常数 4 ( 分隔符 5 ) 分隔符 5 ; 分隔符 5 , 分隔符 5 . 分隔符 5 状态转换图: ①标识符及保留字: ②number: ③关系操作符: Start letter letter or digitt 0 2 1 4 3 5 start digit . digit E + | - digit digit digit digit E digit other other

实验一手工编写简单词法分析程序

编译原理 实 验 报 告 日期: 班级: 题目: 组员:

1实验目的及要求 1.通过设计、编写、调试一个具体的词法分析程序,加深对词法分析原理的理解。 2.掌握在对程序设计语言源程序进行扫描的过程中, 将其分解为各类单词的词法分析方法。2实验平台 Windows + VC + Win32 Console 3实验步骤 1.查询资料,了解词法分析器的工作过程与原理。 2.分析题目,整理出基本设计思路。 3.实践编码,将设计思想转换用c语言编码实现,编译运行。 4.测试功能,多次设置包含不同字符,关键字的待解析文件,仔细察看运行结果,检测该分析器的分析结果是否正确。通过最终的测试发现问题,逐渐完善代码中设置的分析对象与关键字表,拓宽分析范围提高分析能力。

4实验内容 4.1实现下述功能, 并将分析结果保存在文件中. (既可以参考范例程序, 也可 以独立完成) 程序输入/输出示例: 输入一段C语言程序,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、界符。(遇到错误时可显示“Error”,然后跳过错误部分继续显示) 输入源程序示例: main ( ) { int a , b =10; int c ; c = a + b * 20; } 输出固定表格如下 保留字表2

输出动态表格如下 运算符表4 标识符表1常量表3

符号表

4.2 程序: #include #include #include #include //定义关键字 char *Key[10]={"main","void","int","char","printf","scanf","else","if","return"};

实现词法分析器

国家人才培养模式创新实验区、云南省教学团队、云南大学软件学院教育创新基金(编号:2009EI08)联合资助项目 实现词法分析器 姓名: 学号: 专业:软件工程 任课教师:柳青 编制时间:2014年4月15 成绩: 云南大学软件学院 2012年6月制表

报告内容: 1、实验目标 了解词法分析程序的两种设计方法:1.根据状态转换图直接编程的方式;2.利用DFA编写通用的词法分析程序。 2、实现方案 背景: PL/0语言是Pascal语言的子集一种功能简单、结构清晰、可读性强、而又具备了一般高级程序设计语言的必须部分,对PL/0语言的 编译程序能充分体现一个高级语言编译程序实现的基本方法和技术编译的基本过程分为:词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成。另外还有出错处理和表格处理PL/0的词法分析程序是一个独立的过程,其功能是为语法语义分析提供单词,把输入的字符串形式的源程序分割成一个个单词符号 传递给语法语义分析。 硬件环境:Microsoft Windows XP professional2002Inter(R)Core (TM)2Duo CPUT6670@2.20ghz1.18ghz 3.0GB内存软件环境:Microsoft visual C++express 使用语言:C语言 设置的三个全程变量:syn存放单词类别 n存放用户所定义的值 num存放用户所定义的数

3、实现步骤 1.根据状态转换图直接编程 编写一个词法分析程序,它从左到右逐个字符的对源程序进行扫描,产生一个个的单词的二元式,形成二元式(记号)流文件输出。在此,词法分析程序作为单独的一遍,如下图所示。 具体任务有: (1)组织源程序的输入 (2)拼出单词并查找其类别编号,形成二元式输出,得到单词流文件 (3)删除注释、空格和无用符号 (4)发现并定位词法错误,需要输出错误的位置在源程序中的第几行。将错误信息输出到屏幕上。 (5)对于普通标识符和常量,分别建立标识符表和常量表(使用线性表存储),当遇到一个标识符或常量时,查找标识符表或常量表,若存在,则返回位置,否则返回0并且填写符号表或常量表。 标识符表结构:变量名,类型(整型、实型、字符型),分配的数据区地址 注:词法分析阶段只填写变量名,其它部分在语法分析、

词法分析器

实验二词法分析器 一、实验要求 为给定编程语言设计词法分析器 二、实验材料 1、单词结构 ?注释:以“//”开头到该行尾部为注释 ?关键字(共6个):int real if then else while ?标识符:以字母开头,后跟字母或数字的符号串,最长为64个字符。(注意:关键字不是标识符)?操作符(共11个):+ - / * = == < <= > >= != ?分隔符(共5个):( ) { } ; ?数字(用正规式描述): digit ← 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 整数← digit+ (最大整数为231) exponent ← E ( + | - | ε ) digit+ (最大指数为128) fraction ← . digit+ 实数← digit+ exponent | digit+ fraction ( exponent | ε ) 2、词法分析器要求 将词法分析部分设计为一个子程序(以备随后的语法分析器调用)。 输入:input.txt,其内容为指定编程语言的一段程序代码。 输出:output.txt,其内容为四元组形式(单词类型,单词本身,行号,列号),output文件中的每一行对应一个单词的信息。四元组形式中,第一项为单词类型,第二项为单词本身,第三项为单词所在的行号,第四项为单词所在的列号。 注意:词法分析器需要滤掉注释,即在词法分析过程中遇到注释则跳过,继续分析随后的单词信息,词法分析器的输出信息中不含注释。 三、实验提示 1、对于设计词法分析器来说,首先应明确词法分析器是做什么的,然后进行分析和设计, 最后编程实现并测试。即先分析问题,再想解决问题的办法,然后再着手解决问题。2、编程实现词法分析器后,是否进行了测试?特别是,你设计的词法分析器能否滤掉注 释?能否识别小数? 3、在进行词法分析时,会遇到什么样的错误?词法分析器能否识别这些错误?当遇到这些 错误后,词法分析器如何继续进行分析? 四、实验提交资料 1、词法分析器设计思路.doc,其内容包含各类单词的DFA描述、词法分析器的处理流程 等; 2、词法分析器源程序; 3、测试输入文件input.txt及词法分析输出文件output.txt。 这三类资料打包,文件名命名为“学号姓名实验二”,上交至邮箱:tlf1220@https://www.360docs.net/doc/4d418671.html,。 DO IT YOURSELF – CHEATING WILL BE PUNISHED

JAVA实现词法分析器

package BYYL; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; public class CFFX { public int ch; public int code;//保留字状态码 public StringBuffer strToken = new StringBuffer();//存放构成单词符号的字符串 public String [] retainWord = new String[]{"int","if","else","return","main","void","while","break"};//保留字 //判断是否是字母 public boolean IsLetter(){ if((ch>=65 && ch <= 90) || (ch >= 97 && ch <=122)){ return true; } return false; } //判断是否是数字 public boolean IsDigit(){ if(ch>=48 && ch <= 57){ return true; } return false; } //判断是否是空格 public boolean IsBC(int ch){ if(ch == 32){ return true; } return false; } //连接字符 public void Concat(char ch){

相关文档
最新文档