词法分析报告程序设计与实现

合集下载

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

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

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

实验名称:词法分析器的设计与实现

一、实验目的:

1.熟悉编译原理中词法分析的基本概念和原理;

2.掌握正则表达式的使用方法;

3.实现一个简单的词法分析器。

二、实验内容:

1.设计一个简单的编程语言,包含如下几种类型的词法单元:关键字、标识符、常量、运算符和界符。

2.使用正则表达式定义每种词法单元的模式。

3.设计一个词法分析器,将源代码中的每个词法单元识别出来并输出。

三、实验步骤:

1. 确定编程语言的词法单元类型和正则表达式模式,定义相应的单

词类型(如 TokenType)和模式(如 regex)。

2. 实现一个词法分析器的类 Lexer,包含以下方法:

(1)一个构造方法,用于初始化词法分析器的输入源代码。

(2) 一个getNextToken方法,用于获取源代码中的下一个词法单元。

3. 在getNextToken方法中,使用正则表达式逐个识别源代码中的词

法单元,并返回相应的Token对象。

4. 设计一个Token类,包含以下属性:词法单元类型、词法单元的值和位置信息等。

5.在主程序中使用词法分析器,将源代码中的每个词法单元识别出来并输出。

四、实验结果:

1.设计一个简单的编程语言,包含如下词法单元类型(示例):

(1) 关键字:if、else、while、for等;

(2)标识符:变量名等;

(3)常量:整数、浮点数、字符串等;

(4)运算符:+、-、*、/、=等;

(5)界符:(、)、{、}、;等。

2. 实现一个词法分析器,识别出源代码中的每个词法单元,并输出相应的Token对象。

词法分析及词法分析程序

词法分析及词法分析程序
语义加工过程:
– w,p,n初值为0,e初值为1;
– 处理整数部分时,对于每个di ,令w=w10+di ; – 处理小数部分时,对于每个di ,令w=w10+di ;及n++;
– 处理指数时,E后若有‘-’号,令e=-1;计算指数值 p=p10+d;
– 在出口处,令ICON=w或FCON=w10^(e(p-n)).
(3)若当前状态已无后继状态,并且此前经历过终态, 则执行曾经历的最近的终态所对应的语义动作;
(4)若当前状态已无后继状态,并且此前没有经历过终 态,则表明输入字符串有词法错误,报错,并略过余 下的部分词文,从状态0开始继续下一单词的识别。
状态矩阵是稀疏的,应该采用紧凑的数据结构
41
识别无符号数的语义操作
if(Stat=TransMat[CurStat][CurChar]!=NULL) { /*能进行状态转换*/
CurStat=Stat; advance( ); if( CurStat 是终态){
FlagOfFS=HasSeen; /*标记经历过的终态*/ 记下输入串中当前位置及该状态相关联的动作; }/*end if CurStat 是终态*/ }
若Bij为“出错”,则说明输入符号串有误,拒绝接受.扫描
器将调用出错处理程序进行处理
38
程序3-2 状态矩阵驱动程序

实验5 LL(1)语法分析程序的设计与实现(C语言)

实验5 LL(1)语法分析程序的设计与实现(C语言)

实验五LL(1)文法识别程序设计

一、实验目的

通过LL(1)文法识别程序的设计理解自顶向下的语法分析思想。

二、实验重难点

FIRST集合、FOLLOW集合、SELECT集合元素的求解,预测分析表的构造。

三、实验内容与要求

实验内容:

1.阅读并理解实验案例中LL(1)文法判别的程序实现;

2.参考实验案例,完成简单的LL(1)文法判别程序设计。

四、实验学时

4课时

五、实验设备与环境

C语言编译环境

六、实验案例

1.实验要求

参考教材93页预测分析方法,94页图5。11 预测分析程序框图,编写表达式文法的识别程序。要求对输入的LL(1)文法字符串,程序能自动判断所给字符串是否为所给文法的句子,并能给出分析过程。

表达式文法为:

E→E+T|T

T→T*F|F

F→i|(E)

2.参考代码

为了更好的理解代码,建议将图5。11做如下标注:

/* 程序名称:LL(1)语法分析程序*/

/* E—>E+T|T */

/* T—〉T*F|F */

/*F—〉(E)|i */

/*目的:对输入LL(1)文法字符串,本程序能自动判断所给字符串是否为所给文法的句子,并能给出分析过程。

/********************************************/

/*程序相关说明*/

/*A=E’ B=T' */

/* 预测分析表中列号、行号*/

/*0=E 1=E' 2=T 3=T' 4=F */

/*0=i 1=+ 2=*3=(4=) 5=# */

/************************************/

#include”iostream”

实验安排+词法分析程序设计与实现

实验安排+词法分析程序设计与实现

实验一词法分析程序设计与实现

一、实验目的:

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

二、实验内容:

自定义一种程序设计语言,或者选择已有的一种高级语言(C语言),编制它的词法分析程序。词法分析程序的实现可以采用任何一种编程工具。

三、实验要求:

1. 对单词的构词规则有明确的定义;

2. 编写的分析程序能够正确识别源程序中的单词符号;

3. 识别出的单词以的形式保存在符号表中;

4. 词法分析中源程序的输入以.c格式,分析后的符号表保存在.txt文件中。

5. *对于源程序中的词法错误,能够做出简单的错误处理,给出简单的错误提示,保证顺利完成整个源程序的词法分析;

6. 实验报告要求用自动机或者文法的形式对词法定义做出详细说明,说明词法分析程序的工作过程,说明错误处理的实现*。

四、实验学时:6学时

五、实验步骤:

1. 定义目标语言的可用符号表和构词规则;

2. 依次读入源程序符号,对源程序进行单词切分和识别,直到源程序结束;

3. 对正确的单词,按照它的种别以的形式保存在符号表中;

4. *对不正确的单词,做出错误处理*。

六、选作实验

学生可以根据自身的情况完善词法分析程序的错误处理功能(实验要求5&6),如对错误的单词给出准确的位置和错误类型提示。

七、作业提交时间

第8周实验课结束后提交词法分析程序(zzwyanqiu@)。

八、提示

1. char Scanin[100],Scanout[100]; //用于接收输入输出文件名

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

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

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

方法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 rid

rid->ε|letter rid|digit rid

(2)无符号整数的文法

digits->digit remainder

remainder->ε|digit remainder

(3)无符号数的文法

词法分析程序设计与自动构造

词法分析程序设计与自动构造

处理复杂输入情况技巧
01
分词技术
针对中文等需要分词的语言,采用合适的分词技术,如基于词典的分词、
基于统计的分词等,提高分词的准确性和效率。
02
处理歧义现象
对于存在歧义的词汇或短语,采用上下文信息、语义分析等技术进行消
歧处理,确保词法分析的准确性。
03
兼容性和可扩展性
设计词法分析器时考虑兼容性和可扩展性,以便适应不同领域、不同语
转换后的程序代码可以实现对输入字符串的词法分析,识别出其 中的词法单元,并根据词法规则进行相应的处理。同时,程序代 码还需要考虑错误处理、性能优化等问题。
04
自动构造词法分析器工具介绍
Lex/Flex工具原理及使用
01 Lex/Flex工具原理
02
Lex是一种生成词法分析器的工具,它可以根据用户
错误处理
用于处理在词法分析过程中出现的错误,如 语法错误、无法识别的字符等。
02
程序设计语言词法规则
标识符、关键字和保留字
标识符
关键字
保留字
用来标识变量、函数、类、模 块或其他对象的名称。通常, 标识符的命名需要遵循一定的 规则,如以字母或下划线开头 ,后面可以跟字母、数字或下 划线等。
在程序设计语言中,有一些被 赋予特殊含义的单词,它们被 称为关键字。关键字通常用来 表示程序的控制结构、数据类 型等,如`if`、`for`、`while`等 。

计算机编译原理实验报告

计算机编译原理实验报告

编译原理实验报告

实验一词法分析设计

一、实验功能:

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)则费了一番功夫,最后对于常数的小数点问题处理更是麻烦。另外,这个实验要设定好时候退格,否则将会导致字符漏读甚至造成字符重复读取。

词法分析器设计与实现

词法分析器设计与实现

词法分析器设计与实现

一、问题描述:设计并实现一个小型程序语言(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);

词法分析器的实现与设计

词法分析器的实现与设计

词法分析器的实现与设

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.

(完整word版)编译原理词法分析程序实现实验报告

(完整word版)编译原理词法分析程序实现实验报告

(完整word版)编译原理词法分析程序实现实验报告

实验一词法分析程序实现

一、实验内容

选取无符号数的算术四则运算中的各类单词为识别对象,要求将其中的各个单词识别出来。

输入:由无符号数和+,-,*,/, ( , ) 构成的算术表达式,如1.5E+2-100。

输出:对识别出的每一单词均单行输出其类别码(无符号数的值暂不要求计算)。

二、设计部分

因为需要选取无符号数的算术四则运算中的各类单词为识别对象,要求将其中的各个单词识别出来,而其中的关键则为无符号数的识别,它不仅包括了一般情况下的整数和小数,还有以E为底数的指数运算,其中关于词法分析的无符号数的识别过程流程图如下:

GOTO 1:

(完整word版)编译原理词法分析程序实现实验报告

GOTO 2:

三、源程序代码部分

#include

#include

#include

#define MAX 100

#define UNSIGNEDNUMBER 1

#define PLUS 2

#define SUBTRACT 3

#define MULTIPLY 4

#define DIVIDE 5

#define LEFTBRACKET 6

#define RIGHTBRACKET 7

#define INEFFICACIOUSLABEL 8

#define FINISH 111

int count=0;

int Class;

void StoreType();

int Type[100];

char Store[20]={'\0'};

void ShowStrFile();//已经将要识别的字符串存在文件a中

词法分析实验报告(实验一)

词法分析实验报告(实验一)

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

软工082班

兰洁

200831104044

一、实验内容

二、实验目的

三、实验预期

四、程序规定

五、实验原理

●程序流程图

●判别浮点功能扩展流程图

●状态转换图

六、程序代码与浮点判别功能扩展

七、测试用例

●扩展功能测试用例;

●普通功能测试用例

八、输出结果

九、实验心得

一、实验内容:

词法分析:

1、识别简单语言的单词符号;

2、识别关键字、标识符、数字、运算符等。并扩展浮点识别功能。

二、实验目的

调试词法分析程序,加深对词法分析原理的理解,掌握编写简单词法分析程序的一般步骤。

三、实验预期结果:

经过调试源代码程序,程序能够成功运行编译,对输入的简单字符串,能够别关键字、标识符、数字、运算符等,并且给出单词符号的对应编码。

四、程序规定:

1、关键字:"function","if","then","while","do","endfunc";

2、算术运算符:”+”,”-”,”*”,”/”,”=”;

3、关系运算符:"<" ">" "<=" ">=" "==" "!=";

4、界符:"(" ")" ";" "#";

5、标识符规定以字母开头,字母均为小写;

6、空格和换行符跳过;

7、单词对应编码:

十、实验原理:

输入串--------------------〉词法分析程序————————〉单词符号串

输入:字符串以#结束。

输出:单词的二元组(syn,token/sum)

程序流程图

分析浮点数功能扩展部分流程图:

shuzi()函数

状态转换图

六、程序代码:

备注:红色字体部分为程序功能的功能扩展,使程序能够分析浮点数!

词法分析实验报告

词法分析实验报告

词法分析器

一、实验目的:

通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。

编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。

二、实验要求

如源程序为C语言。输入如下一段:Array main()

{

int a,b;

a = 10;

b = a + 20;

}#

要求输出如右图。

要求:

1、将单词分为五种

识别关键字:main、if、int、for、while、do、return、break、continue;

单词种别码为1。

标识符;单词种别码为2。

常数为无符号整形数;单词种别码为3。

运算符包括:+、-、*、/、=、>、<、>=、<=、!= ;

单词种别码为4。

分隔符包括:,、;、{、}、(、);单词种别码为5。

2、使用一符一种的分法

关键字、运算符和分界符可以每一个均为一种

标识符和常数仍然一类一种

三、实验内容

1、功能描述

改程序是一个实现词法分析的功能,能识别5种单词,其他单词报错。

2、程序结构描述

int IsKey(char *Word)关键字匹配函数,查询是否为关键字,若是,返回值为1,否则为0。int IsAlpha(char c) 查看是否为字母,若是,返回值为1,否则为0。

int IsNum(char c) 查看是否为数字,若是,返回值为1,否则为0。

void scanner(FILE *fp) 扫描函数,扫描程序中的字符串并调用上述三种函数检查是否是字母、数字,是否是关键字,并输出。

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

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

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

一、实验内容

【实验目的和要求】

设计、编制、调试一个具体的词法分析程序,加深对词法分析原理的理解。

【实验内容】

通过对PL/0词法分析程序(GETSYM)的分析,并在此基础上按照附录A中给出的PL/0语言的语法描述,编写一个PL/0语言的词法分析程序。此程序应具有如下功能:输入为字符串(待进行词法分析的源程序),输出为单词串,即由(单词、类别)所组成的二元组序列。

有一定检查错误的能力,例如发现2A这类不能作为单词的字符串。

【实验环境】

Windows PC机,任何语言。

【提交内容】

提交实验报告,报告内容如下:

目的要求、算法描述、程序结构、主要变量名说明、程序清单、调试情况、设计技巧、心得体会。

提交源程序和可执行文件。

【学时】

4课时。

二、实验说明

词法分析程序的任务就是扫描源程序,依据词法规则识别单词并报告构词错误信息。通常将单词分为5种类型。

1)基本字:也叫关键字、保留字,是程序设计语言用来表示特定语法含义的一种标识符,如if、begin等。

2)运算符:如+、-、*、/、:=、>、

3)标识符:用户定义的变量名、常数名、函数名等。不同的高级程序设计语言对关键字是否可以作为普通标识符有不同的要求,有的语言允许程序员使用关键字作为普通标识符,有的程序设计语言则不允许程序员将关键字用着普通标识符(如C/C++、Pascal等都不允许)。在允许程序员将关键字用作普通标识符的程序设计语言的编译器中,编译器必须具备能够区分一个标识符到底是关键字还是普通标识符的功能。

4)常数:如23、6等。

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

编译技术-第11章-词法分析程序的自动生成技术
过程 布尔函数
函数 过程
存放当前读入的字符 存放单词字符串
读字符到CHAR,移动指针 反复调用GETCHAR,
直至CHAR进入一个非空白字符 CHAR与TOKEN连接 判断
读字符指针后退一个字符 判断TOKEN中的字符串 是保留字, 还是标识符 字符串到数字的转换 出错处理
字母、数字
S 字母 标 非字母数字
语言的单词符号
标识符 保留字(标识符的子集) 无符号整数 单分界符 + * :,( ) 双分界符 :=
两点说明:1. 空格的作用
2. 实数的表示
• 文法:1. <标识符>::= 字母 | <标识符>字母 | <标识符>数字 2. <无符号整数>::=数字 | <无符号整数>数字 3. <单字符分界符>::= : | + | * | , | ( | ) 4. <双字符分界符>::= <冒号>= 5. <冒号>::= :
例:x=0110 和1011
•问题:
1
S
0
01
V
1
1、上述分析过程是属于自底向上分析?还是自顶向下分析?
2、怎样确定句柄?
Z
U
0 Z
V Z
Z =|=> V1 =|=>Z01 =|=>U001 =|=> 1001

词法分析设计实验报告(附代码)

词法分析设计实验报告(附代码)

实验一词法分析设计

实验学时:4

实验类型:综合

实验要求:必修

一、实验目的

通过本实验的编程实践,使学生了解词法分析的任务,掌握词法分析程序设计的原理和构造方法,使学生对编译的基本概念、原理和方法有完整的和清楚的理解,并能正确地、熟练地运用。

二、实验内容

用VC++/VB/JAVA语言实现对C语言子集的源程序进行词法分析。通过输入源程序从左到右对字符串进行扫描和分解,依次输出各个单词的内部编码及单词符号自身值;若遇到错误则显示“Error”,然后跳过错误部分继续显示;同时进行标识符登记符号表的管理。

以下是实现词法分析设计的主要工作:

(1)从源程序文件中读入字符。

(2)统计行数和列数用于错误单词的定位。

(3)删除空格类字符,包括回车、制表符空格。

(4)按拼写单词,并用(内码,属性)二元式表示。(属性值——token的机内表示)

(5)如果发现错误则报告出错

(6)根据需要是否填写标识符表供以后各阶段使用。

单词的基本分类:

◆关键字:由程序语言定义的具有固定意义的标识符。也称为保留字例如if、 for、while、printf ;单词种别码为1。

◆标识符:用以表示各种名字,如变量名、数组名、函数名;

◆常数:任何数值常数。如 125, 1,0.5,3.1416;

◆运算符:+、-、*、/;

◆关系运算符: <、<=、= 、>、>=、<>;

◆分界符:;、,、(、)、[、];

三、实验要求

1、编程时注意编程风格:空行的使用、注释的使用、缩进的使用等。

2、将标识符填写的相应符号表须提供给编译程序的以后各阶段使用。

词法分析程序设计与实现

词法分析程序设计与实现

实验一词法分析程序设计与实现

一、实验目的及内容

调试并完成一个词法分析程序,加深对词法分析原理的理解。

二、实验原理(状态转换图)

1、C语言子集

(1)关键字:

begin if then while do end

所有关键字都是小写。

(2)运算符和界符:

:= + –* / < <= <> > >= = ; ( ) #

(3)其他单词是标识符(ID)和整型常数(NUM),通过以下正规式定义:ID=letter(letter| digit)*

NUM=digit digit *

(4)空格由空白、制表符和换行符组成。空格一般用来分隔ID、NUM,运算符、界符和关键字,词法分析阶段通常被忽略。

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()

  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、各种单词符号对应的种别码

3、词法分析程序的功能

输入:所给文法的源程序字符串。

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

其中:syn为单词种别码;

token为存放的单词自身字符串;

sum为整型常数。

二、软件平台及工具

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++)

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;

相关文档
最新文档