词法分析程序设计与实现

合集下载

一个简单的词法分析器

一个简单的词法分析器

实验一词法分析程序设计与实现一、实验目的:加深对词法分析器的工作过程的理解;加强对词法分析方法的掌握;能够采用一种编程语言实现简单的词法分析程序;能够使用自己编写的分析程序对简单的程序段进行词法分析。

二、实验内容:自定义一种程序设计语言,或者选择已有的一种高级语言(C语言),编制它的词法分析程序。

词法分析程序的实现可以采用任何一种编程工具。

三、实验要求:1. 对单词的构词规则有明确的定义;2. 编写的分析程序能够正确识别源程序中的单词符号;3. 识别出的单词以<种别码,值>的形式保存在符号表中;4. 词法分析中源程序的输入以.c格式,分析后的符号表保存在.txt文件中。

5. *对于源程序中的词法错误,能够做出简单的错误处理,给出简单的错误提示,保证顺利完成整个源程序的词法分析;6. 实验报告要求用自动机或者文法的形式对词法定义做出详细说明,说明词法分析程序的工作过程,说明错误处理的实现*。

四、实验学时:12学时五、实验步骤:1. 定义目标语言的可用符号表和构词规则;2. 依次读入源程序符号,对源程序进行单词切分和识别,直到源程序结束;3. 对正确的单词,按照它的种别以<种别码,值>的形式保存在符号表中;4. *对不正确的单词,做出错误处理*。

词法分析(Lexical Analysis) 是编译的第一阶段。

词法分析器的主要任务是读入源程序的输入字符、将他们组成词素,生成并输出一个词法单元序列,每个词法单元对应一个词素。

这个词法单元序列被输出到语法分析器进行语法分析。

知识储备词法单元:由一个词法单元名和一个可选的属性值组成。

词法单元名是一个表示某种词法单位的抽象符号,比如一个特定的关键字,或者代表一个标识符的输入字符序列。

词法单元名字是由语法分析器处理的输入符号。

模式:描述了一个词法单元的词素可能具有的形式。

词素:源程序中的一个字符序列,它和某个词法单元的模式匹配,并被词法分析器识别为该词法单元的一个实例。

词法分析器的实现与设计

词法分析器的实现与设计

题目:词法分析器的设计与实现一、引言................................ 错误!未定义书签。

二、词法分析器的设计 (3)2.1词的内部定义 (3)2.2词法分析器的任务及功能 (3)32.2.2 功能: (4)2.3单词符号对应的种别码: (4)三、词法分析器的实现 (5)3.1主程序示意图: (5)3.2函数定义说明 (6)3.3程序设计实现及功能说明 (6)错误!未定义书签。

77四、词法分析程序的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语言设计词法分析器,由指定文件读入预分析的源程序,经过词法分析器的分析,将结果写入指定文件。

词法分析器实验报告

词法分析器实验报告

词法分析器实验报告词法分析器实验报告一、引言词法分析器是编译器中的重要组成部分,它负责将源代码分解成一个个的词法单元,为之后的语法分析提供基础。

本实验旨在设计和实现一个简单的词法分析器,以深入理解其工作原理和实现过程。

二、实验目标本实验的目标是设计和实现一个能够对C语言代码进行词法分析的程序。

该程序能够将源代码分解成关键字、标识符、常量、运算符等各种词法单元,并输出其对应的词法类别。

三、实验方法1. 设计词法规则:根据C语言的词法规则,设计相应的正则表达式来描述各种词法单元的模式。

2. 实现词法分析器:利用编程语言(如Python)实现词法分析器,将源代码作为输入,根据词法规则将其分解成各种词法单元,并输出其类别。

3. 测试和调试:编写测试用例,对词法分析器进行测试和调试,确保其能够正确地识别和输出各种词法单元。

四、实验过程1. 设计词法规则:根据C语言的词法规则,我们需要设计正则表达式来描述各种词法单元的模式。

例如,关键字可以使用'|'操作符将所有关键字列举出来,标识符可以使用[a-zA-Z_][a-zA-Z0-9_]*的模式来匹配,常量可以使用[0-9]+的模式来匹配等等。

2. 实现词法分析器:我们选择使用Python来实现词法分析器。

首先,我们需要读取源代码文件,并将其按行分解。

然后,针对每一行的代码,我们使用正则表达式进行匹配,以识别各种词法单元。

最后,我们将识别出的词法单元输出到一个结果文件中。

3. 测试和调试:我们编写了一系列的测试用例,包括各种不同的C语言代码片段,以测试词法分析器的正确性和鲁棒性。

通过逐个测试用例的运行结果,我们可以发现和解决词法分析器中的问题,并进行相应的调试。

五、实验结果经过多次测试和调试,我们的词法分析器能够正确地将C语言代码分解成各种词法单元,并输出其对应的类别。

例如,对于输入的代码片段:```cint main() {int a = 10;printf("Hello, world!\n");return 0;}```我们的词法分析器将输出以下结果:```关键字:int标识符:main运算符:(运算符:)运算符:{关键字:int标识符:a运算符:=常量:10运算符:;标识符:printf运算符:(常量:"Hello, world!\n"运算符:)运算符:;关键字:return常量:0运算符:;```可以看到,词法分析器能够正确地将代码分解成各种词法单元,并输出其对应的类别。

词法分析程序的设计与实现

词法分析程序的设计与实现

词法分析程序的设计与实现方法1:采用C作为实现语言,手工编制一.文法及状态转换图1.语言说明:C语言有以下记号及单词:(1)标识符:以字母开头的、后跟字母或数字组成的符号串。

(2)关键字:标识符集合的子集,该语言定义的关键字有32个,即auto,break,case,char,const,continue,default,do,double,else,enum, extern,float,for,goto,if,int,long,register,return,short,signed,static, sizeof,struct,switch,typedef ,union,unsigned ,void, volatile和while。

(3)无符号数:即常数。

(4)关系运算符:<,<=,==,>,>=,!=。

(5)逻辑运算符:&&、||、!。

(6)赋值号:=。

(7)标点符号:+、++、-、--、*、:、;、(、)、?、/、%、#、&、|、“”、,、.、{}、[]、_、^等(8)注释标记:以“/*”开始,以“*/”结束。

(9)单词符号间的分隔符:空格。

2.记号的正规文法:仅给出各种单词符号的文法产生式(1)标识符的文法id->letter ridrid->ε|letter rid|digit rid(2)无符号整数的文法digits->digit remainderremainder->ε|digit remainder(3)无符号数的文法num->digit num1num1->digit num1|. num2|E num4|εnum2->digit num3num3->digit num3|E num4|εnum4->+digits|-digits|digit num5digits->digit num5num5->digit num5|ε(4)关系运算符的文法relop-> <|<=|==|>|>=|!=(5)赋值号的文法assign_op->=(6)标点符号的文法special_symbol->+|-|*|%|#|^|(|)|{|}|[|]|:|;|”|?|/|,|.& (7)逻辑运算符的文法logic->&&| || | !(8)注释头符号的文法note->/starstar->*3.状态转换图其中,状态0是初始状态,若此时读入的符号是字母,则转换到状态1,进入标识符识别过程;如果读入的是数字,则转换到状态2,进入无符号数识别过程;……;若读入的符号是/,转换到状态11,再读入下一个符号,如果读入的符号是*,则转换到状态12,进入注释处理状态;如果在状态0读入的符号不是语言所定义的单词符号的开始字符,则转换到状态13,进入错误处理状态。

词法分析器的实现与设计

词法分析器的实现与设计

词法分析器的实现与设计Company Document number:WUUT-WUUY-WBBGB-BWYTT-1982GT题目:词法分析器的设计与实现摘要:词法分析是中文信息处理中的一项基础性工作。

词法分析结果的好坏将直接影响中文信息处理上层应用的效果。

通过权威的评测和实际应用表明,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语言设计词法分析器,由指定文件读入预分析的源程序,经过词法分析器的分析,将结果写入指定文件。

词法分析器设计与实现

词法分析器设计与实现

词法分析器设计与实现一、问题描述:设计并实现一个小型程序语言(Micro)的词法分析器,实现源程序的输入,预处理词法分析,最后以编译程序需要的内部表示形式(二元组)将识别的单词符号输出。

利用状态转换图设计Micro语言的词法规则,用C语言实现该词法分析程序。

实验环境:C/C++开发平台。

二、Micro的单词分类:标识符:字母打头的字母/数字串常数:数字打头的数字串保留字:begin,end, var,read,write,integer,real符号:+,*,(,),:,=,;三、设计思想1)本程序的状态转换图如下:图1:标识符状态表示图图2:识别常数状态表示图图3:识别符号状态表示图2)状态转换图的实现a)ch 字符变量,读进最新的源程序字符b)strToken 字符数组,存放构成单词符号的字符串有了以上定义,对常数状态转换图可得:if(ch>='0'&&ch<='9'){strToken[i++]=ch;ch=fgetc(in);while(ch>='0'&&ch<='9'){strToken[i++]=ch;ch=fgetc(in);}if(ch!='.') {strToken[i++]='\0';fprintf(out,"%s%d,%c%s%c%s\n","(",3,'"',strToken,'"',")"); }else{strToken[i++]=ch;ch=fgetc(in);while(ch>='0'&&ch<='9'){strToken[i++]=ch;ch=fgetc(in);}strToken[i++]='\0';fprintf(out,"%s%d,%c%s%c%s\n","(",3,'"',strToken,'"',")"); }while(ch==' '){ch=fgetc(in);}}3)单词符号及内部种别码,对Micro种别码的设定:四、实验结果本次实验输入输出都采用文件形式。

词法分析器设计与实现

词法分析器设计与实现

合肥学院计算机科学与技术系课程实验报告2016~2017学年第二学期课程软件编译技术学生姓名罗萱(组长)学号1404092012学生姓名郑李学号1404092013学生姓名丁希林学号1404092016专业班级14软工2班指导教师吴晓琴2017 年 3 月签字:年月日ﻬ实验序号及名称:实验一词法分析器的设计与实现姓名: 郑李实验时间:2017年3月25日六、完整的实验结果(程序、电路或相关的数据等)记录(不够可在第四页续)输入:main(){ int a,b;a = 10;ﻩb= a + 20;}实验结果:main 2 ( 5) 5{ 5int 0a 2, 5b 2, 5 c 2; 5 a 2= 48 3; 5b 2= 4ﻬ实验序号及名称:实验一词法分析器的设计与实现姓名: 丁希林实验时间:2017年3月25日六、完整的实验结果(程序、电路或相关的数据等)记录(不够可在第四页续)输入:main(){ int a,b;a = 10;b = a+ 20;}实验结果:main 2( 5 ) 5 { 5int 0a2, 5b2, 5 c 2 ; 5 a 2= 48 3 ; 5b 2 = 4实验序号及名称:实验一词法分析器的设计与实现姓名: 罗萱实验时间:2017年3月25日六、完整的实验结果(程序、电路或相关的数据等)记录(不够可在第四页续)输入:main(){ int a,b;a = 10;ﻩb= a + 20;}实验结果:main 2 ( 5) 5{ 5int 0a 2, 5b 2, 5c 2; 5a 2 = 48 3 ; 5b 2=4。

词法分析报告

词法分析报告

编译原理实验报告实验一词法分析程序的设计与实现指导教师:姓名:学号:班级:一、实验目的基本掌握计算机语言的词法分析程序的开发方法。

二、实验内容编制一个能够分析三种整数、标识符、主要运算符和主要关键字的词法分析程序。

三、实验要求1.根据以下的正规式,编制正规文法,画出状态图;标识符<字母>(<字母>|<数字字符>)*十进制整数0 | (1|2|3|4|5|6|7|8|9) (0|1|2|3|4|5|6|7|8|9)*八进制整数0 (0|1|2|3|4|5|6|7) (0|1|2|3|4|5|6|7)*十六进制整数0 (x|X) (0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f) (0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)*运算符和分隔符+ - * / > < = ( ) ;关键字if then else while do2.根据状态图,设计词法分析函数int scan( ),完成以下功能:(1)从输入流(键盘或文件)读入数据,分析出一个单词。

(2)返回单词种别(用整数表示),(3)返回单词属性(不同的属性可以放在不同的全局变量中)。

3.编写测试程序,循环调用函数scan( ),每次调用,获得一个单词的信息。

在测试程序中,打印输出单词种别、属性(注意:不要在词法分析函数scan 中打印输出!)。

四、实验环境微型计算机。

Windows 操作系统/Linux 操作系统。

编程语言:C/C++/Java/C#。

建议使用Visual C++/Netbeans/Eclipse 集成开发环境。

五、实验步骤1. 根据状态图,设计词法分析算法2. 设计函数scan( ),实现该算法3. 编制测试程序(在本试验中,可以是主函数main( ) )。

4. 调试程序:输入一组单词,检查输出结果。

六、状态图七. 测试数据:0 92+data> 0x3f00 while八.测试结果九,思考题1.词法分析能否采用空格来区分单词?答:不能,因为比如abc+bcd中没有空格,但这是三个单词。

编译技术-第11章-词法分析程序的自动生成技术

编译技术-第11章-词法分析程序的自动生成技术
3.2 词法分析程序的设计与实现 --状态图:有穷自动机的非形式表示 ---正则文法和状态图 3.3 词法分析程序的自动生成 --正则表达式和有穷自动机
内容
3.1 词法分析程序的功能及实现方案 3.2 单词的种类及词法分析程序的输出形式 3.3 正则文法和状态图 3.4 词法分析程序的设计与实现 3.5 正则表达式与有穷自动机 3.6 词法分析程序的自动生成器
1、置初始状态为当前状态,从x的最左字符开始, 重复步骤2,直到x右端为止。
2、扫描x的下一个字符,在当前状态所射出的弧中 找出标记有该字符的弧,并沿此弧过渡到下一个状 态;如果找不到标有该字符的弧,那么x不是句子 ,过程到此结束;如果扫描的是x的最右端字符, 并从当前状态出发沿着标有该字符的弧过渡到下一 个状态为终止状态Z,则x是句子。
其状态图为:
Start
S
0
V
1. 每个非终结符设一个状态; 2. 设一个开始状态S; 3. 若Q::=T, Q ∈Vn,T ∈Vt, 4. 若Q::=RT, Q、R∈Vn,T ∈Vt, 5. 加上开始状态和终止状态标志
1 0 1
U
1
0
Z
• 识别算法
1
S
U
0
01
0
V
1
Z
利用状态图可按如下步骤分析和识别字符串x:
1. 令G的每个非终结符都是一个状态;
2. 设一个开始状态S;
T
3. 若Q::=T, Q ∈Vn,T ∈Vt, 则: 4. 若Q::=RT, Q、R∈Vn,T ∈Vt, 则:
Q
S
T
Q
R
5. 按自动机方法,可加上开始状态和终止状态标志。
例如:正则文法 Z::= U0 |V1 U ::=Z1 |1 V ::=Z0 | 0

Cminus语言词法分析器的设计

Cminus语言词法分析器的设计

实验一:词法分析程序‎的设计与实现‎‎姓名:‎‎‎‎‎专业‎班级:‎‎‎学号‎:‎‎‎一、实验目的‎‎设计一个简单的词法‎分析器,从而进一步加‎深对词法分析器工作‎原‎理的理解。

二.‎、实‎验内容编制一‎个能够‎分析三种整数‎、标识符‎、主要运算‎符和主要关‎键字的词‎法分析程序。

‎三、‎实验要求根据‎P L‎/0语言文法,编‎制‎词法分析程序GET‎S YM完成以下功能:‎1)从键盘读入数‎据‎,分析出一个单词‎。

‎2)返回单词种‎别(用‎整数表示),‎3)返‎回单词属性‎(不同的属‎性可以放‎在不同的全局‎变量中‎)。

四.、实‎验步‎骤1. 采用C‎语‎言,设计GETSY‎M,实现该算法2‎.编制测试程序(‎主‎函数main)。

‎3‎.调试程序:‎输入一‎组单词,检查‎输出结果‎。

五.、‎实验设计分‎析1.词法‎的正规式描述‎S=‎a A|aA=‎(a‎A|dA)}(a‎|‎d)2.变换后的正规‎文法S→aAS→‎aA→aAA→‎d‎AA→aA→‎d3.‎词法分析程序的‎程序代‎码#inc‎l ude‎"std‎a fx.h‎"#i‎n clude‎<i‎o stream‎>‎#include‎<‎s tring>u‎s ing names‎p ace std;‎‎#define ‎M‎A X 17 ‎‎‎c har‎ch =‎' ';‎s tri‎n gkey‎[17‎]={"con‎s t‎","long"‎,‎"float","‎d ouble","v‎o id","mai‎n‎","if","‎e l‎s e","th‎e n"‎,"brea‎k","‎i nt",‎"char‎","i‎n clude‎","‎f or","w‎h i‎l e","pri‎n‎t f","scan‎f"};int ‎I skey(str‎i‎n g c){ ‎‎/‎/关键‎字判断‎int‎i;‎for‎(i=0‎;i<MAX‎;i+‎+){‎‎if(k‎e‎y[i].comp‎a re(c)==0)‎return 1‎;‎}‎‎retur‎n 0‎;}in‎t Is‎L ette‎r(cha‎r c)‎{ ‎‎//判断是‎否为‎字母i‎f‎(((c<='z'‎)&&(c>='a'‎))||((c<=‎'‎Z')&&(c>‎='‎A'))) r‎e tu‎r n 1;‎‎e lse ‎r etur‎n 0;‎}int‎Is‎L etter1‎(c‎h ar c)‎{‎/‎/判断是否为a~f字‎母if(‎(‎(c<='f')‎&&‎(c>='a'‎))|‎|((c<=‎'F')‎&&(c>‎='A')‎)) r‎e turn ‎1;‎els‎e‎r eturn 0‎;‎}int Is‎D igit(char‎c){ ‎‎//判‎断是‎否为数字‎‎i f(c>=‎'0'&‎&c<='‎9') r‎e tur‎n 1;‎‎else r‎e t‎u rn 0;}‎‎v oid scan‎(FILE *fpi‎n){‎s‎t ring ar‎r=‎"";‎wh‎i le((c‎h=fg‎e tc(f‎p in))‎!=EO‎F){‎‎a‎r r‎=""; ‎‎‎if(ch=‎=' '||ch=‎=‎'\t'||ch‎==‎'\n'){}‎‎‎‎els‎e if(‎I sLe‎t ter(c‎h)|‎|ch=='_‎')‎{‎‎a rr=arr+c‎h;ch=f‎g etc(fpin‎)‎;‎‎‎w‎h ile(I‎s Let‎t er(c‎h)||I‎s Dig‎i t(ch)‎)‎{‎‎if((ch<‎=‎'Z')&&(ch‎>='A')) ch‎=ch+32; ‎‎‎‎‎‎‎‎a rr=a‎r r+ch‎;‎‎‎‎‎c h=fgetc‎(‎f pin);‎}‎‎‎fseek(f‎p i‎n,-1L,S‎E EK‎_CUR);‎‎‎‎‎if‎(I‎s key(ar‎r)‎){cout<<‎a‎r r<<"\t关键‎字"<<endl;}‎‎‎‎‎else‎c‎o ut<<a‎r r<<‎"\t普通‎标识符"<‎<end‎l;‎}‎else‎i‎f(IsDigi‎t‎(ch)){‎int f‎l ag=0;‎‎if(ch==‎'0‎')‎{‎ar‎r=ar‎r+ch;‎‎ch=‎f getc(‎f pi‎n);‎‎i f(ch>='‎0‎'&&ch<='7‎'){‎‎w‎h ile(ch>‎='‎0'&&ch<‎='7‎')‎{‎‎‎f lag‎=1;‎‎arr‎=a‎r r+ch;‎‎ch‎=fgetc(fpi‎n);‎‎}}‎‎els‎e i‎f(ch==‎'x'|‎|ch==‎'X')‎‎{‎‎f lag=2;‎‎arr‎=‎a rr+ch;‎ch‎=fgetc(fp‎i‎n);‎‎w hile(I‎s Di‎g it(ch‎)||I‎s Lett‎e r1(c‎h))‎‎{‎‎‎‎‎‎arr=arr+‎c h;‎‎ch=fge‎t c‎(fpin);‎‎}‎‎}‎el‎s e i‎f(ch==‎' '‎||ch=='‎,'‎||ch==';‎'‎){‎cou‎t<<arr<<"‎\‎t整数0"<<e‎n d‎l;‎}‎f‎s eek‎(fpin‎,-1L,‎S EEK‎_CUR);‎‎‎‎‎‎i f(flag==‎1) cout<<‎a rr<<"\t八‎进‎制整数"<<en‎d l‎;‎e ls‎e if(f‎l ag=‎=2) ‎cout‎<<ar‎r<<"\t‎十六进‎制整数"<<e‎n d‎l;}‎‎‎els‎e{‎‎arr‎=a‎r r+ch;‎‎ch=f‎g etc‎(fpin‎);‎w‎h ile(I‎s Di‎g it(ch)‎)‎{‎‎‎‎arr=ar‎r‎+ch;‎‎‎‎‎c‎h=fge‎t c(fp‎i n);‎‎}‎‎‎‎f‎s eek(fpin‎,-1L,SEEK_‎C UR);‎‎‎‎cou‎t<<‎a rr<<"‎\t十进‎制整数"<‎<endl‎;‎}‎}‎‎e‎l se swit‎c‎h(ch)‎{‎‎‎c‎a s‎e'+':‎‎‎‎case‎'-' :‎‎‎‎case‎'*‎' :‎‎‎case'=' :‎ca‎s‎e'|' :‎‎‎‎case‎'/' ‎:cout‎<<ch<‎<"\t‎运算符"<<‎e nd‎l;break‎;‎‎‎cas‎e'(' :‎‎‎case')‎'‎:‎‎‎cas‎e'[' ‎:‎‎‎c‎a se']' ‎:‎‎‎‎‎case';'‎‎:‎‎‎c as‎e'.' :‎‎‎‎ca‎s e',' ‎:‎‎‎cas‎e‎'{' :‎‎case'}'‎‎:cout<<c‎h<‎<"\t界符"‎<<e‎n dl;br‎e ak;‎‎‎‎case‎':'‎:{ch=f‎g e‎t c(fpin)‎;‎‎‎if(‎c‎h=='=') ‎c o‎u t<<":=‎"<<‎"\t运算符‎"<<e‎n dl;‎‎‎‎‎e‎l s‎e‎‎{‎cout<<"::‎"<<"\t界符"‎<‎<endl;;‎‎‎‎‎‎‎fsee‎k(fp‎i n,-1L‎,SE‎E K_CUR)‎;‎}‎‎‎‎}bre‎a‎k;‎‎‎c as‎e'>' :‎{ch=‎f getc‎(fpin‎);‎‎‎‎‎if‎(‎c h=='=') ‎c out<<">="‎<<"\t运算符"‎<‎<endl;‎‎‎‎‎‎if(‎c h=='‎>')c‎o ut<<"‎>>"‎<<"\t输入‎控制‎符"<<endl‎;‎‎‎el‎s‎e {cout<‎<"‎>"<<"\t‎运算符‎"<<end‎l;‎‎‎‎‎‎fs‎e e‎k(fpin,-‎1‎L,SEEK_CU‎R);}‎‎‎‎‎}break;‎‎‎‎cas‎e'<' ‎:{ch‎=fgetc‎(fp‎i n);‎‎‎‎‎if(ch==‎'=')cout<‎<‎"<="<<"\‎t运‎算符"<<en‎d l;‎‎‎‎‎‎else‎if‎(ch=='<‎')‎c out<<"<‎<‎"<<"\t输出控‎制符"<<endl;‎‎‎‎‎e‎l se‎if(ch‎=='>‎') co‎u t<<"‎<>"<‎<"\t运算‎符"<‎<endl;‎‎‎‎‎else{‎c out<<"<"‎<‎<"\t运算符"‎<<‎e ndl;‎‎‎‎‎‎‎f seek(‎f pi‎n,-1L,S‎E E‎K_CUR);}‎‎‎‎}bre‎a‎k;‎‎‎d ef‎a ult :‎cou‎t<<ch‎<<"\t‎无法识别‎字符"<<e‎n dl‎;}‎‎}}voi‎d‎main(){‎char i‎n_fn[30];‎‎FILE ‎*‎f pin;‎c‎o ut<<"‎请输入源‎文件名(包‎括路径和后‎缀名):‎";‎f or‎(;;){‎‎cin>‎>‎i n_fn;‎if((f‎p in=fopen‎(‎i n_fn,"r‎")‎)!=NULL‎) b‎r eak;‎‎el‎s e co‎u t<<‎"文件路径错‎误!请‎输入源文件名(‎包括‎路径和后缀名):‎"‎;}‎cout<<"‎\n分析如下:\n‎"‎<<endl;‎‎scan(f‎p in‎);‎f clo‎s e(fp‎i n);‎}七‎.实验测试:‎输入‎数据及运行结果‎:‎i nt a=3;‎‎d ouble b=‎4;int c;‎i f(a>b)c‎=‎a;else‎c=‎b;‎。

词法分析器-计算器-设计与实现实验报告汇总

词法分析器-计算器-设计与实现实验报告汇总

辅导教师张静成绩else if(choice2(rz[st])==1)st=number(st);else if(rz[st]=='/')st=anotation(st);else st=other(st);return st;}测试结果:8、心得通过本次的实验,使我真正的了解词法分析器的实现过程,让我更加深刻领悟词法分析器的实现原理.虽然在本次实验中遇到了各种各样的困难和错误,但在同学们的帮助下我都一一克服了,使得词法分析器能够正确的识别相应的词法和表达式。

在做实验的过程中,总是会忽略各种细节,从而导致经常修改一些很小的低级错误才能使程序正常运行,不仅浪费时间,还影响对其他地方的修改,并且在很多步骤处理上,方法不正确。

使结果不能符合要求,深刻体会到了自己在编程方面与别人的差距,在今后的学习中,我会注意改正自己在这方面的缺点,促使自己的编程水平不断进步。

编译原理是一门专业学科,对于辅导教师张静成绩实验日期实验时间1实验名称计算器的设计与实现2、实验目的掌握自上而下语法分析方法、自下而上语法分析方法3、实验要求(1)实验内容设计及实现计算表达式的计算器。

表达式中可包含+、-、*、/、(、)等运算符.(2)实验要求:对已给的一个二元式形式表达式,能够检查有无语法错误.并指定出错位置。

将表达式的语法树输出(或将语法分析过程输出).4、实验原理根据算符优先分析思想实现语法分析程序。

5、实验步骤(1)根据文法构造语法分析表。

(2)编写总控程序实现语法分析.6、算符优先分析表及语法分析程序算符优先分析表:case '(': /*当是的时候将此括号存入栈op*/op.top++;op.data[op.top]=ch;break;case ’)’:while(op.data[op。

top] != ’(’)/*括号内的转换优先级最高故先提取表达式*/{exp[t]=op.data[op。

实验一 词法分析程序的设计与实现(C语言)

实验一 词法分析程序的设计与实现(C语言)

实验一 词法分析程序的设计与实现(C 语言)一、实验目的通过C 语言词法分析程序的实现理解编译程序过程中对单词的分析过程。

二、实验重难点DFA 自动机的数据结构表示,程序流程图,词法分析程序实现三、实验内容与要求实验内容:1. 设计存储DFA 自动机的数据结构2.绘制程序流程图3. 词法分析程序设计四、实验学时2课时五、实验设备与环境C 语言编译环境六、根据实验过程填写下列内容1.DFA 自动机的状态转换图和数据结构设计。

a /b2. 程序流程图(见附页)3. 代码#include<stdio.h>int f(int x,char e){ int df[4][2]={{2,3},{4,3},{2,4},{4,4}};U a a a S b Q bV bint i;if(e=='a')i=df[x][1];if(e=='b')i=df[x][2];return(i);}void main(){ int S=1,U=2,V=3,Q=4;int k=S;char c;printf("请输入字符,按#结束:\n");c=getchar();while(c!='#'){k=f(k,c);c=getchar();}if(k==Q) printf("你输入的字符串能被DFA所识别\n");else printf("你输入的字符串能被DFA所识别\n");}4.测试数据及结果分析(结果见附页)分析:从实验的结果可以看出上面程序代码基本上可以实现所给DFA的要求,但是有关实验的可读性和功能方面还有待进一步改进。

程序流程图教师评语:是否完成实验程序的预备设计? 是: 不是: 程序能否正常运行? 是: 不是: 有无测试数据及结果分析 是: 不是: 是否在本次规定时间完成所有项目? 是: 不是: 实验成绩等级: 教师签名:N0:时间:开始初始化输入句子判断是否退出标志判断是否被接受?接受不接受输出错误位置NY NY结束。

类C语言的词法分析程序

类C语言的词法分析程序

实验一词法分析程序设计与实现一、实验目的通过设计调试词法分析程序,实现从源程序中分出各种单词的方法;加深对课堂教学的理解,深刻理解词法分析的整个过程,提高词法分析方法的实践能力。

二、实验要求(1)从源程序文件中读取有效字符和并将其转换成二元组机内表示形式输出。

(2)掌握词法分析的实现方法。

(3)实验要求独立完成,不允许有抄袭现象。

(4)实验完成后,要上交实验报告(包括源程序清单)。

(附:实验报告格式)三、实验内容1、主程序设计考虑:主程序的说明部分为各种表格和变量安排空间(关键字和特殊符号表)。

id 和ci 数组分别存放标识符和常数;还有一些为造表填表设置的变量。

主程序的工作部分建议设计成便于调试的循环结构。

每个循环处理一个单词;接收键盘上送来的一个单词;调用词法分析过程;输出每个单词的内部码。

2)词法分析过程考虑该过程取名为lexical,它根据输入单词的第一个有效字符(有时还需读第二个字符),判断单词类,产生类号。

对于标识符和常数,需分别与标识符表和常数表中已登记的元素相比较,如表中已有该元素,则记录其在表中的位置,如未出现过,将标识符按顺序填入数组id 中,将常数变为存入数组中ci 中,并记录其在表中的位置。

注:所有识别出的单词都用二元组表示。

第一个表示单词的种类。

关键字的t=1;标识符的t=2;常数t=3;运算符t=4;界符t=5。

第二个为该单词在各自表中的指针或内部码值(常数表和标识符表是在编译过程中建立起来的。

其i 值是根据它们在源程序中出现的顺序确定的)。

将词法分析程序设计成独(入口)立一遍扫描源程序的结构。

其主流程图如下:图5-1 词法分析程序流程图例1:狭义的词法分析:分析字符串有多少个单词public class CalWord{ public static void main(String args[]){ String s1="My friend . Welcome to Java!"; //建立文本语句System.out.println("The words of this sentence :");int n=0; //设立单词记数器for (int i=0;i<s1.length();i++) //从语句开始直到它的结束处逐一检查{ char m=s1.charAt(i); //逐一将语句中的字符读入m中if (Character.toLowerCase(m)<97 ||Character.toLowerCase(m)>122)//当m为非字母字符时表示一个单词结束n=n+1;}System.out.print(n);}}例2:《java面向对象程序设计》P190 例9.10import java.util.Scanner;public class Example9_10 {public static void main (String args[ ]) {System.out.println("一行文本:");Scanner reader=new Scanner(System.in);String str= reader.nextLine(); //空格字符、数字和符号(!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~)组成的正则表达式:String regex="[\\s\\d\\p{Punct}]+";String words[]=str.split(regex);for(int i=0;i<words.length;i++){int m=i+1;System.out.println("单词"+m+":"+words[i]);}}}。

北邮大三上-编译原理-词法分析实验报告

北邮大三上-编译原理-词法分析实验报告

北邮大三上-编译原理-词法分析实验报告编译原理第三章词法分析班级:2009211311学号:姓名:schnee目录1.实验题目和要求 (3)2.检测代码分析 (3)3.源代码 (4)1.实验题目和要求题目:词法分析程序的设计与实现。

实验内容:设计并实现C语言的词法分析程序,要求如下。

(1)、可以识别出用C语言编写的源程序中的每个单词符号,并以记号的形式输出每个单词符号。

(2)、可以识别并读取源程序中的注释。

(3)、可以统计源程序汇总的语句行数、单词个数和字符个数,其中标点和空格不计算为单词,并输出统计结果(4)、检查源程序中存在的错误,并可以报告错误所在的行列位置。

(5)、发现源程序中存在的错误后,进行适当的恢复,使词法分析可以继续进行,通过一次词法分析处理,可以检查并报告源程序中存在的所有错误。

实验要求:方法1:采用C/C++作为实现语言,手工编写词法分析程序。

方法2:通过编写LEX源程序,利用LEX软件工具自动生成词法分析程序。

2.检测代码分析1、Hello World简单程序输入:2、较复杂程序输入:3. 异常程序输入检测三,源代码#include <cmath>#include <cctype>#include <string>#include <vector>#include <cstdio>#include <cstdlib>#include <cstring>#include <fstream>#include <iostream>#include <algorithm>using namespace std;const int FILENAME=105;const int MAXBUF=82;const int L_END=40;const int R_END=81;const int START=0; //开始指针vector<string> Key; //C保留的关键字表class funtion //词法分析结构{public://变量声明char filename[FILENAME]; //需要词法分析的代码文件名ifstream f_in;char buffer[MAXBUF]; //输入缓冲区int l_end, r_end, forward; //左半区终点,右半区终点,前进指针,bool l_has, r_has; //辅助标记位,表示是否已经填充过缓冲区vector<string> Id; //标识符表char C; //当前读入的字符int linenum, wordnum, charnum; //行数,单词数,字符数string curword; //存放当前的字符串//函数声明void get_char(); //从输入缓冲区读一个字符,放入C中,forward指向下一个void get_nbc(); //检查当前字符是否为空字符,反复调用直到非空void retract(); //向前指针后退一位void initial(); //初始化要词法分析的文件void fillBuffer(int pos); //填充缓冲区,0表示左,1表示右void analyzer(); //词法分析void token_table(); //以记号的形式输出每个单词符号void note_print(); //识别并读取源程序中的注释void count_number(); //统计源程序汇总的语句行数、单词个数和字符个数void error_report(); //检查并报告源程序中存在的所有错误void solve(char* file); //主调用函数};void welcome(){printf("\n************************************** *******************\n");printf( "** Welcome to use LexicalAnalyzer **\n");printf( "** By schnee @BUPT Date: 2011/20/10 **\n");printf( "*********************************************************\n\n\n");}void initKey(){Key.clear();Key.push_back("auto"); Key.push_back("break"); Key.push_back("case"); Key.push_back("char");Key.push_back("const");Key.push_back("continue");Key.push_back("default"); Key.push_back("do");Key.push_back("double");Key.push_back("else"); Key.push_back("enum"); Key.push_back("extern");Key.push_back("float"); Key.push_back("for"); Key.push_back("goto"); Key.push_back("if");Key.push_back("int");Key.push_back("long");Key.push_back("register");Key.push_back("return");Key.push_back("short");Key.push_back("signed"); Key.push_back("static"); Key.push_back("sizeof");Key.push_back("struct");Key.push_back("switch"); Key.push_back("typedef"); Key.push_back("union");Key.push_back("unsigned");Key.push_back("void"); Key.push_back("volatile");Key.push_back("while");}void funtion::get_char(){C=buffer[forward];if(C==EOF)return ; //结束if(C=='\n')linenum++; //统计行数和字符数else if(isalnum(C)) charnum++;forward++;if(buffer[forward]==EOF){if(forward==l_end){fillBuffer(1);forward++;}else if(forward==r_end){fillBuffer(0);forward=START;}}}void funtion::get_nbc(){while(C==' ' || C=='\n' || C=='\t' || C=='\0') get_char();}void funtion::initial(char* file){Id.clear(); //清空标识符表l_end=L_END;r_end=R_END; //初始化缓冲区forward=0;l_has=r_has=false;buffer[l_end]=buffer[r_end]=EOF;fillBuffer(0);linenum=wordnum=charnum=0; //初始化行数,单词数,字符数}void funtion::fillBuffer(int pos){if(pos==0)//填充缓冲区的左半边{if(l_has==false){fin.read(buffer, l_end);if(fin.gcount()!=l_end)buffer[fin.gcount()]=EOF;}else l_has=false;}else //填充缓冲区的右半边{if(r_has==false){fin.read(buffer+l_end+1, l_end);if(fin.gcount()!=l_end)buffer[fin.gcount()+l_end+1]=EOF;}else r_has=false;}}void funtion::retract(){if(forward==0){l_has=true; //表示已经读取过文件,避免下次再次读取forward=l_end-1;}else{forward--;if(forward==l_end){r_add=true;forward--;}}}void funtion::analyzer(){FILE *token_file, *note_file, *count_file, *error_file;token_file=fopen("token_file.txt", "w");note_file=fopen("note_file.txt", "w");count_file=fopen("count_file.txt", "w");error_file=fopen("error_file.txt", "w");int i;curword.clear();get_char();get_nbc();if(C==EOF)return false;if(isalpha(C) || C=='_')//关键字和标识符的处理,以字母或下划线开头{curword.clear();while(isalnum(C) || C=='_'){curword.push_back(C);get_char();}retract();wordnum++;Id.push_back(curword);for(i=0; i<Key.size(); i++)if(Key[i]==curword)break;//输出每一个单词的标识符if(i<Key.size()) //关键字fprintf(token_file, "%8d----%20s %s\n", wordnum, "KEY WORD", curword);elsefprintf(token_file, "%8d----%20s %s\n", wordnum, "Identifier", curword);}else if(isdigit(C))//无符号数的处理{curword.clear();while(isdigit(C)){curword.push_back(C);get_char();}if(C=='.' || C=='E' || C=='e')//处理小数和指数形式{curword.push_back(C);get_char();while(isdigit()){curword.push_back(C);get_char();}}retract();wordnum++;Id.push_back(curword);fprintf(token_file, "%8d----%20s %s\n", wordnum, "Unsigned Number", curword);}else if(C=='#')//过滤掉以#开头的预处理{fprintf(note_file, "preproccess Line %d : ", linenum);get_char();fprintf(note_file, "%c", C);while(C!='\n'){get_char();fprintf(note_file, "%c", C);}fprintf(note_file, "%c", C);}else if(C=='"')//""内的句子当成整个串保存起来{curword.clear();get_char();while(C!='"'){curword.push_back(C);get_char();}fprintf(token_file, "*****string in ""----%s\n", curword);}else if(C=='/'){get_char();if(C=='/')//过滤掉//开头的行注释{fprintf(note_file, "single-line note Line %d : ", linenum);get_char();curword.clear();while(C!='\n'){curword.push_back(C);get_char();}fprintf(note_file, "%s\n", curword);}else if(C=='*')//过滤掉/**/之间的段注释{fprintf(note_file, "paragraph note Line %d : ", linenum);get_char();while(true){while(C!='/'){fprintf(note_file, "%c", C);get_char();}get_char();if(C=='*'){fprintf(note_file, "\nto Line %d\n", linenum);break;}fprintf(note_file, "%c", C);}}else if(C=='=')fprintf(token_file, "*****ASSIGN-OP, DIV\n");else{fprintf(token_file, "*****CAL-OP, DIV\n");retract();}} //处理各种比较,赋值,运算符号else if(C=='<'){get_char();if(C=='=')fprintf(token_file, "*****RELOP, LE\n");else{fprintf(token_file, "*****RELOP, LT\n");retract();}}else if(C=='>'){get_char();if(C=='=')fprintf(token_file, "*****RELOP, GE\n");else{fprintf(token_file, "*****RELOP, GT\n");retract();}}else if(C=='='){get_char();if(C=='=')fprintf(token_file, "*****RELOP, EQ\n");else{fprintf(token_file, "*****ASSIGN-OP, EASY\n");retract();}}else if(C=='+'){get_char();if(C=='=')fprintf(token_file, "*****ASSIGN-OP, ADD\n");else{fprintf(token_file, "*****CAL-OP, ADD\n");retract();}}else if(C=='-'){get_char();if(C=='=')fprintf(token_file, "*****ASSIGN-OP, SUB\n");else{fprintf(token_file, "*****CAL-OP, SUB\n");retract();}}else if(C=='*'){get_char();if(C=='=')fprintf(token_file, "*****ASSIGN-OP, MUL\n");else{fprintf(token_file, "*****CAL-OP, MUL\n");retract();}}else if(C=='!'){get_char();if(C=='=')fprintf(token_file, "*****RELOP, UE\n");else if(!isalpha(C) && C!='_'){fprintf(error_file, "Line %d: error: '!' was illegal char \n", linenum);}}else if(C==':' || C=='(' || C==')' || C==';' || C=='{' || C=='}' || C==',')fprintf(token_file, "*****Other char----%c\n", C);elsefprintf(error_file, "Line %d: error: '%c' was illegal char \n", linenum, C);fprintf(count_file, "The Line number is %d\n", linenum);fprintf(count_file, "The word number is %d\n", wordnum);fprintf(count_file, "The char number is %d\n",charnum);fclose(token_file);fclose(note_file);fclose(count_file);fclose(error_file);}void funtion::token_table(){fin.open("token_file.txt");printf("The token_table is as following:\n");char str[1];while(1){fin.read(str, 1);if(str[0]!=EOF)printf("%c", str[0]);}}void funtion::note_print(){fin.open("note_file.txt");printf("The note is as following:\n");char str[1];while(1){fin.read(str, 1);if(str[0]!=EOF)printf("%c", str[0]);}}void funtion::count_number(){fin.open("count_file.txt");printf("The count result is as following:\n");char str[1];while(1){fin.read(str, 1);if(str[0]!=EOF)printf("%c", str[0]);}}void funtion::error_report(){fin.open("error_file.txt");printf("The error report is as following:\n");char str[1];while(1){fin.read(str, 1);if(str[0]!=EOF)printf("%c", str[0]);}}void funtion::solve(char* file){filename=file;fin.open(filename);intitial();analyzer();int choice;printf("**** We have analyzed %s \n");printf("**0: To end\n");printf("**1: To get the token table\n");printf("**2: To get the note part of file\n");printf("**4: To report all the error of the file\n");printf("**3: To get the line num, word num and charter num\n\n");while(1){printf("****please input your choice: ");scanf("%d", &choice);if(choice==0)break;if(choice==1)token_table();else if(choice==2)note_print();else if(choice==3)count_number();else error_report();printf("\n");}}void LexicalAnaylzer(char* file){funtion test;test.solve(file);}int main(){welcome();initKey();char file[FILENAME];while(1){printf("\nDo you want to continue? ("YES" or "NO"): ");scanf("%s", file);if(strcmp(file, "NO")==0){printf("Thanks for your use! GoodBye next time!\n\n");break;}printf("Please type your C file name(for example: a.cpp): ");scanf("%s", file);LexicalAnalyzer(file);}return 0;}。

实验一词法分析

实验一词法分析
cout<<"输出该非标示符:";
for (int i=0;i<50;i++)
{
cout<<a[i];
}
cout<<endl;
cout<<"------------字符串判断完毕------------"<<endl;
}
system("pause");
return 0;
}
Vc6.0新建空工程+源文件
{
b[k]=a[t+1]; //存放是标识符的字符
k++;
}
else if((a[t+1]>='0')&&(a[t+1]<='9')) //识别是非标识符的字符
{
c[m]=a[t+1]; //存放是单个数字的字符
m++;
}
else{
e[p]=a[t+1]; //存放是非标识符的字符
p++;
}
}
cout<<"--------------判断结果----------------"<<endl;
char a[50]={0}; //存放字符串
char b[50]={0}; //存放标志符
char d[50]={0}; //存放非标识符
cout<<"请输入字符串(以$结束):"<<endl;
for(int i=0;i<50;i++)

词法分析程序设计与实现

词法分析程序设计与实现

实验一词法分析程序设计与实现一、实验目的及内容调试并完成一个词法分析程序,加深对词法分析原理的理解。

二、实验原理(状态转换图)1、C语言子集(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为整型常数。

二、软件平台及工具PC机以及VISUAL C++6.0软件。

三、实验方法、步骤(或:程序代码或操作过程)(1)程序代码:#include<stdio.h>#include<string.h>#include<iostream.h>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++)if(strcmp(token,rwtab[n])==0){syn=n+1;break;}}else if((ch>='0'&&ch<='9')){{sum=0;while((ch>='0'&&ch<='9')){sum=sum*10+ch-'0';ch=prog[p++];}}p--;syn=11;if(sum>32767)syn=-1;}else switch(ch){case'<':m=0;token[m++]=ch;ch=prog[p++];if(ch=='>'){syn=21;token[m++]=ch;}else if(ch=='='){syn=22;token[m++]=ch;}else{syn=23;p--;}break;case'>':m=0;token[m++]=ch;ch=prog[p++];if(ch=='='){syn=24;token[m++]=ch;}else{syn=20;p--;}break;case':':m=0;token[m++]=ch;ch=prog[p++];if(ch=='=')syn=18;token[m++]=ch;}else{syn=17;p--;}break;case'*':syn=13;token[0]=ch;break;case'/':syn=14;token[0]=ch;break;case'+':syn=15;token[0]=ch;break; case'-':syn=16;token[0]=ch;break;case'=':syn=25;token[0]=ch;break; case';':syn=26;token[0]=ch;break;case'(':syn=27;token[0]=ch;break;case')':syn=28;token[0]=ch;break;case'#':syn=0;token[0]=ch;break;case'\n':syn=-2;break;default: syn=-1;break;}}void main(){p=0;row=1;cout<<"Please input string:"<<endl;do{cin.get(ch);prog[p++]=ch;while(ch!='#');p=0;do{scaner();switch(syn){case 11: cout<<"("<<syn<<","<<sum<<")"<<endl; break;case -1: cout<<"Error in row "<<row<<"!"<<endl; break;case -2: row=row++;break;default: cout<<"("<<syn<<","<<token<<")"<<endl;break;}}while (syn!=0);}(2)创建编辑程序(3)连接、编译和调试程序(4)运行程序五、实验过程原始记录( 测试数据、图表、计算等)(1)给定源程序begin x:=8; if x>0 then x:=2*x+1/5; end#输出结果(2)源程序(包括上式未有的while、do以及判断错误语句):beginx<=$;whilea<0dob<>9-x;end#。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

`
实验一词法分析程序设计与实现
一、实验目的及容
调试并完成一个词法分析程序,加深对词法分析原理的理解。

二、实验原理(状态转换图)
1、C语言子集
(1)关键字:
begin if then while do end
所有关键字都是小写。

(2)运算符和界符:
:= + – * / < <= <> > >= = ; ( ) #
(3)其他单词是标识符(ID)和整型常数(NUM),通过以下正规式定义:ID=letter(letter| digit)*
NUM=digit digit *
(4)空格由空白、制表符和换行符组成。

空格一般用来分隔ID、NUM,运算符、界符和关键字,词法分析阶段通常被忽略。

2、各种单词符号对应的种别码
文档Word
`
3、词法分析程序的功能
输入:所给文法的源程序字符串。

输出:二元组(syn,token或sum)构成的序列。

其中:syn为单词种别码;
token为存放的单词自身字符串;
sum为整型常数。

二、软件平台及工具
PC机以及VISUAL C++6.0软件。

三、实验方法、步骤(或:程序代码或操作过程)(1)程序代码:
#include<stdio.h>
#include<string.h>
#include<iostream.h>
char prog[80],token[8];
char ch;
int syn,p,m=0,n,row,sum=0;
char *rwtab[6]={egin,if,hen,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'))
文档Word
`
{
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++)
if(strcmp(token,rwtab[n])==0)
{
syn=n+1;
break;
}
}
else if((ch>='0'&&ch<='9'))
{
{
sum=0;
while((ch>='0'&&ch<='9'))
{
sum=sum*10+ch-'0';
ch=prog[p++];
}
}
p--;
syn=11;
if(sum>32767)
syn=-1;
}
文档Word
`
else switch(ch)
{
case'<':m=0;token[m++]=ch;
ch=prog[p++];
if(ch=='>')
{
syn=21;
token[m++]=ch;
}
else if(ch=='=')
{
syn=22;
token[m++]=ch;
}
else
{
syn=23;
p--;
}
break;
case'>':m=0;token[m++]=ch;
ch=prog[p++];
if(ch=='=')
{
syn=24;
token[m++]=ch;
}
else
{
syn=20;
p--;
}
文档Word
`
break;
case':':m=0;token[m++]=ch;
ch=prog[p++];
if(ch=='=')
{
syn=18;
token[m++]=ch;
}
else
{
syn=17;
p--;
}
break;
case'*':syn=13;token[0]=ch;break;
case'/':syn=14;token[0]=ch;break;
case'+':syn=15;token[0]=ch;break;
case'-':syn=16;token[0]=ch;break;
case'=':syn=25;token[0]=ch;break;
case';':syn=26;token[0]=ch;break;
case'(':syn=27;token[0]=ch;break;
case')':syn=28;token[0]=ch;break;
case'#':syn=0;token[0]=ch;break;
case'\n':syn=-2;break;
default: syn=-1;break;
}
}
void main()
{
p=0;
row=1;
文档Word
` cout<<Please input string:<<endl;
do
{
cin.get(ch);
prog[p++]=ch;
}
while(ch!='#');
p=0;
do
scaner();
switch(syn)
{
case 11: cout<<(<<syn<<,<<sum<<)<<endl; break;
case -1: cout<<Error in row <<row<<!<<endl; break; case -2: row=row++;break;
default: cout<<(<<syn<<,<<token<<)<<endl;break; }
}
while (syn!=0);
}
(2)创建编辑程序
文档Word
`
(3)连接、编译和调试程序
(4)运行程序
五、实验过程原始记录( 测试数据、图表、计算等)
(1)给定源程序
文档Word
`
end# then x:=2*x+1/5; x:=8; if x>0 begin
输出结果
(2)源程序(包括上式未有的while、do以及判断错误语句):begin
x<=$;
while
a<0
do
b<>9-x;
end
#
文档Word。

相关文档
最新文档