词法分析实验报告
编译原理词法分析实验报告
编译原理词法分析实验报告实验名称:词法分析器的设计与实现一、实验目的: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对象。
五、实验总结:通过本次实验,我熟悉了编译原理中词法分析的基本概念和原理,并掌握了正则表达式的使用方法。
我成功完成了一个简单的词法分析器的设计与实现,实现了源代码中每个词法单元的识别与输出。
这次实验对我深化了对编译原理中词法分析的理解,并提高了我的编程能力。
词法分析程序实验报告
词法分析程序实验报告篇一:词法分析器_实验报告词法分析器实验报告实验目的:设计、编制、调试一个词法分析子程序-识别单词,加深对词法分析原理的理解。
实验要求:该程序要实现的是一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分界符五大类。
并依次输出各个单词的内部编码及单词符号自身值。
(一)实验内容(1)功能描述:对给定的程序通过词法分析器弄够识别一个个单词符号,并以二元式(单词种别码,单词符号的属性值)显示。
而本程序则是通过对给定路径的文件的分析后以单词符号和文字提示显示。
(2)程序结构描述:函数调用格式:参数含义:String string;存放读入的字符串 String str; 存放暂时读入的字符串 char ch; 存放读入的字符 int rs 判断读入的文件是否为空 char []data 存放文件中的数据 int m;通过switch用来判断字符类型,函数之间的调用关系图:函数功能:Judgement()判断输入的字符并输出单词符号,返回值为空; getChar() 读取文件的,返回值为空;isLetter(char c) 判断读入的字符是否为字母的,返回值为Boolean类型; switch (m) 判断跳转输出返回值为空;isOperator(char c)判断是否为运算符的,返回值为Boolean类型; isKey(String string)判断是否为关键字的,返回值为Boolean类型; isDigit(char c) 判断读入的字符是否为数字的,返回值为Boolean类型。
(二)实验过程记录:本次实验出错3次,第一次无法输出双运算符,于是采用双重if条件句进行判断,此方法失败,出现了重复输出,继续修改if语句,仍没有成功。
然后就采用了直接方法调用解决此问题。
对于变量的判断,开始忘了考虑字母和数字组成的变量,结果让字母和数字分家了,不过改变if语句的条件,解决了此问题。
词法分析实验报告
词法分析实验报告词法分析实验报告引言词法分析是自然语言处理中的一个重要环节,它负责将输入的文本分割成一个个的词语,并确定每个词语的词性。
本次实验旨在通过实现一个简单的词法分析器,来探索词法分析的原理和实践。
实验内容本次实验中,我们使用Python编程语言来实现词法分析器。
我们选取了一段简单的英文文本作为输入,以便更好地理解和演示词法分析的过程。
1. 文本预处理在进行词法分析之前,我们首先需要对输入文本进行预处理。
预处理的目的是去除文本中的标点符号、空格和其他无关的字符,以便更好地进行后续的分词操作。
2. 分词分词是词法分析的核心步骤之一。
在这个步骤中,我们将文本分割成一个个的词语。
常见的分词方法包括基于规则的分词和基于统计的分词。
在本次实验中,我们选择了基于规则的分词方法。
基于规则的分词方法通过事先定义一系列的分词规则来进行分词。
这些规则可以是基于语法的,也可以是基于词典的。
在实验中,我们使用了一个简单的基于词典的分词规则,即根据英文单词的常见前缀和后缀来进行分词。
3. 词性标注词性标注是词法分析的另一个重要步骤。
在这个步骤中,我们为每个词语确定其词性。
词性标注可以通过事先定义的规则和模型来进行。
在本次实验中,我们使用了一个简单的基于规则的词性标注方法。
基于规则的词性标注方法通过定义一系列的词性标注规则来进行词性标注。
这些规则可以是基于词法的,也可以是基于语法的。
在实验中,我们使用了一个简单的基于词法的词性标注规则,即根据英文单词的后缀来确定其词性。
实验结果经过实验,我们得到了输入文本的分词结果和词性标注结果。
分词结果如下:- I- love- natural- language- processing词性标注结果如下:- I (代词)- love (动词)- natural (形容词)- language (名词)- processing (名词)讨论与总结通过本次实验,我们深入了解了词法分析的原理和实践。
编译原理实验词法分析实验报告
编译原理实验词法分析实验报告一、实验目的词法分析是编译过程的第一个阶段,其主要任务是从左到右逐个字符地对源程序进行扫描,产生一个个单词符号。
本次实验的目的在于通过实践,深入理解词法分析的原理和方法,掌握如何使用程序设计语言实现词法分析器,提高对编译原理的综合应用能力。
二、实验环境本次实验使用的编程语言为_____,开发工具为_____。
三、实验原理词法分析的基本原理是根据编程语言的词法规则,将输入的字符流转换为单词符号序列。
单词符号通常包括关键字、标识符、常量、运算符和界符等。
词法分析器的实现方法有多种,常见的有状态转换图法和正则表达式法。
在本次实验中,我们采用了状态转换图法。
状态转换图是一种有向图,其中节点表示状态,有向边表示在当前状态下输入字符的可能转移。
通过定义不同的状态和转移规则,可以实现对各种单词符号的识别。
四、实验步骤1、定义单词符号的类别和编码首先,确定实验中要识别的单词符号种类,如关键字(if、else、while 等)、标识符、整数常量、浮点数常量、运算符(+、、、/等)和界符(括号、逗号等)。
为每个单词符号类别分配一个唯一的编码,以便后续处理。
2、设计状态转换图根据单词符号的词法规则,绘制状态转换图。
例如,对于标识符的识别,起始状态为“起始状态”,当输入为字母时进入“标识符中间状态”,在“标识符中间状态”中,若输入为字母或数字则继续保持该状态,直到遇到非字母数字字符时结束识别,确定为一个标识符。
3、编写词法分析程序根据状态转换图,使用所选编程语言实现词法分析器。
在程序中,通过不断读取输入字符,根据当前状态进行转移,并在适当的时候输出识别到的单词符号。
4、测试词法分析程序准备一组包含各种单词符号的测试用例。
将测试用例输入到词法分析程序中,检查输出的单词符号是否正确。
五、实验代码以下是本次实验中实现词法分析器的核心代码部分:```include <stdioh>include <ctypeh>//单词符号类别定义typedef enum {KEYWORD,IDENTIFIER,INTEGER_CONSTANT,FLOAT_CONSTANT,OPERATOR,DELIMITER} TokenType;//关键字列表char keywords ={"if","else","while","for","int","float","void"};//状态定义typedef enum {START,IN_IDENTIFIER,IN_INTEGER,IN_FLOAT,IN_OPERATOR} State;//词法分析函数TokenType getToken(char token, int tokenLength) {State state = START;int i = 0;while (1) {char c = getchar();switch (state) {case START:if (isalpha(c)){state = IN_IDENTIFIER;tokeni++= c;} else if (isdigit(c)){state = IN_INTEGER;tokeni++= c;} else if (c =='+'|| c ==''|| c ==''|| c =='/'|| c =='('|| c ==')'|| c ==';'|| c ==','){state = IN_OPERATOR;tokeni++= c;} else if (c ==''){state = IN_FLOAT;tokeni++= c;} else if (c == EOF) {tokeni ='\0';tokenLength = i;return -1;} else {tokeni ='\0';tokenLength = i;return -2;}break;case IN_IDENTIFIER:if (isalpha(c) || isdigit(c)){tokeni++= c;} else {ungetc(c, stdin);tokeni ='\0';tokenLength = i;//检查是否为关键字for (int j = 0; j < sizeof(keywords) / sizeof(keywords0); j++){if (strcmp(token, keywordsj) == 0) {return KEYWORD;}}return IDENTIFIER;}break;case IN_INTEGER:if (isdigit(c)){tokeni++= c;} else if (c ==''){state = IN_FLOAT;tokeni++= c;} else {ungetc(c, stdin);tokeni ='\0';tokenLength = i;return INTEGER_CONSTANT;}break;case IN_FLOAT:if (isdigit(c)){tokeni++= c;} else {ungetc(c, stdin);tokeni ='\0';tokenLength = i;return FLOAT_CONSTANT;}break;case IN_OPERATOR: tokeni ='\0';tokenLength = i;return OPERATOR; break;}}}int main(){char token100;int tokenLength;TokenType tokenType;while ((tokenType = getToken(token, &tokenLength))!=-1) {switch (tokenType) {case KEYWORD:printf("Keyword: %s\n", token);break;case IDENTIFIER:printf("Identifier: %s\n", token);break;case INTEGER_CONSTANT:printf("Integer Constant: %s\n", token);break;case FLOAT_CONSTANT:printf("Float Constant: %s\n", token);break;case OPERATOR:printf("Operator: %s\n", token);break;case DELIMITER:printf("Delimiter: %s\n", token);break;}}return 0;}```六、实验结果对准备的测试用例进行输入,得到的词法分析结果如下:测试用例 1:```int main(){int num = 10;float pi = 314;if (num > 5) {printf("Hello, World!\n");}}```词法分析结果:```Keyword: int Identifier: main Delimiter: (Delimiter: ){Identifier: num Operator: =Integer Constant: 10;Identifier: float Identifier: pi Operator: =Float Constant: 314;Keyword: ifDelimiter: (Identifier: numOperator: >Integer Constant: 5){Identifier: printfDelimiter: (String: "Hello, World!\n" Delimiter: );}```测试用例 2:```for (int i = 0; i < 10; i++){double result = i 25;```词法分析结果:```Keyword: for Delimiter: (Keyword: int Identifier: i Operator: =Integer Constant: 0;Identifier: i Operator: <Integer Constant: 10;Identifier: i Operator: ++)Identifier: doubleIdentifier: resultOperator: =Identifier: iOperator:Float Constant: 25;}```通过对多个测试用例的分析,词法分析器能够正确识别出各种单词符号,实验结果符合预期。
编译原理-词法语法分析实验报告
编译原理词法分析一、实验目的设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。
二、实验要求2.1 待分析的简单的词法(1)关键字:begin if then while do end所有的关键字都是小写。
(2)运算符和界符:= + - * / < <= <> > >= = ; ( ) #(3)其他单词是标识符(ID)和整型常数(SUM),通过以下正规式定义:ID = letter (letter | digit)*NUM = digit digit*(4)空格有空白、制表符和换行符组成。
空格一般用来分隔ID、SUM、运算符、界符和关键字,词法分析阶段通常被忽略。
2.2 各种单词符号对应的种别码:2.3 词法分析程序的功能:输入:所给文法的源程序字符串。
输出:二元组(syn,token或sum)构成的序列。
其中:syn为单词种别码;token为存放的单词自身字符串;sum为整型常数。
例如:对源程序begin x:=9: if x>9 then x:=2*x+1/3; end #的源文件,经过词法分析后输出如下序列:(1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)……三、词法分析程序的C语言程序源代码:#include <stdio.h>#include <string.h>char prog[80],token[8],ch;int syn,p,m,n,sum;char *rwtab[6]={"begin","if","then","while","do","end"};scaner();void scanner_example (FILE *fp);main(){FILE *fp;fp=fopen("D:\\1.txt","r");//打开文件scanner_example (fp);scaner();}void scanner_example (FILE *fp){do{ch=fgetc (fp);prog[p++]=ch;}while (ch!='#');p=0;do{scaner();switch(syn){case 11:printf("( %-10d%5d )\n",sum,syn);break;case -1:printf("you have input a wrong string\n");default: printf("( %-10s%5d )\n",token,syn);break;}}while(syn!=0);}scaner(){ sum=0;for(m=0;m<8;m++)token[m++]=NULL;ch=prog[p++];m=0;while((ch==' ')||(ch=='\n'))ch=prog[p++];if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))){ while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9'))) {token[m++]=ch;ch=prog[p++];}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')){ while((ch>='0')&&(ch<='9')){ sum=sum*10+ch-'0';ch=prog[p++];}p--;syn=11;}else switch(ch){ case '<':token[m++]=ch;ch=prog[p++];if(ch=='='){ syn=22;token[m++]=ch;}else{ syn=20;p--;}break;case '>':token[m++]=ch;ch=prog[p++];if(ch=='='){ syn=24;token[m++]=ch;}else{ syn=23;p--;}break;case '+': token[m++]=ch;ch=prog[p++];if(ch=='+'){ syn=17;token[m++]=ch;}else{ syn=13;p--;}break;case '-':token[m++]=ch;ch=prog[p++];if(ch=='-'){ syn=29;token[m++]=ch;}else{ syn=14;p--;}break;case '!':ch=prog[p++];if(ch=='='){ syn=21;token[m++]=ch;}else{ syn=31;p--;}break;case '=':token[m++]=ch;ch=prog[p++];if(ch=='='){ syn=25;token[m++]=ch;}else{ syn=18;p--;}break;case '*': syn=15;token[m++]=ch;break;case '/': syn=16;token[m++]=ch;break;case '(': syn=27;token[m++]=ch;break;case ')': syn=28;token[m++]=ch;break;case '{': syn=5;token[m++]=ch;break;case '}': syn=6;token[m++]=ch;break;case ';': syn=26;token[m++]=ch;break;case '\"': syn=30;token[m++]=ch;break;case '#': syn=0;token[m++]=ch;break;case ':':syn=17;token[m++]=ch;break;default: syn=-1;break;}token[m++]='\0';}四、结果分析:输入begin x:=9: if x>9 then x:=2*x+1/3; end # 后经词法分析输出如下序列:(begin 1)(x 10)(:17)(= 18)(9 11)(;26)(if 2)……如图所示:五、总结:词法分析的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。
词法分析实验报告
词法分析实验报告一、实验目的和背景词法分析是编译原理中的重要部分之一,其主要作用是将源程序中的字符序列转化为有意义的单词序列,以便于后续的处理和分析。
为了更好地理解词法分析的实现原理以及掌握相关算法和工具,本次词法分析实验旨在通过手动编写正则表达式、确定有限自动机的状态转移函数和实现词法分析程序来实现词法分析。
二、实验内容在本次实验中,我们需要完成以下任务:1.手动编写正则表达式;2.确定有限自动机的状态转移函数;3.实现词法分析程序。
三、实验过程1.手动编写正则表达式对于给定的源程序,我们首先需要根据其语法规则手动编写正则表达式。
例如,对于一个简单的算术表达式,其正则表达式可以如下所示:i. 数字(0-9):[0-9]+ii. 加号(+):\+iii. 减号(-):-iv. 乘号(*):\*v. 除号(/):/vi. 左括号(():\(vii. 右括号()):\)2.确定有限自动机的状态转移函数根据正则表达式,我们可以确定有限自动机的状态转移函数。
例如,对于上述算术表达式的正则表达式,其有限自动机的状态转移函数如下所示:i. 初始状态(S):判断下一个字符,如果是数字则进入数字状态,如果是左括号则进入左括号状态;ii. 数字状态(D):继续判断下一个字符,如果是数字则保持在数字状态,如果是运算符则输出数字记号,返回初始状态,如果是右括号则输出数字记号,返回初始状态;iii. 左括号状态(L):输出左括号记号,返回初始状态;iv. 右括号状态(R):输出右括号记号,返回初始状态。
3.实现词法分析程序根据以上的正则表达式和有限自动机的状态转移函数,我们可以编写一个简单的词法分析程序。
该程序的主要流程如下所示:i. 读取源程序的字符序列;ii. 根据有限自动机的状态转移函数,逐个字符进行状态转移;iii. 如果当前状态为接受状态,则输出相应的记号;iv. 继续进行状态转移,直至读取完整个源程序。
四、实验结果通过以上步骤,我们成功完成了对给定源程序的词法分析。
词法分析实验报告
词法分析器一、实验目的:通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。
并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。
编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。
并依次输出各个单词的内部编码及单词符号自身值。
二、实验要求如源程序为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) 扫描函数,扫描程序中的字符串并调用上述三种函数检查是否是字母、数字,是否是关键字,并输出。
fseek(fp,-1,1)回退一个字符。
fgetc(fp)从数据流中区下一个字符。
fopen 文件打开函数,返回指向文件第一个字符的指针四、实验结果测试内容为main(){int a,b;a = 10;b = a + 20; }#结果测试代码为void main() {int a,b; if(a = 10;)b += 20; c=%;}#结果为测试代码main(){int a,b;if(a <= "10")b += 20;c=%@;return 0;}#结果五、实验过程记录1、因为用到回退函数fseek(),而以前没有用过这个函数,所以开始时很苦恼,不知道如何回退一个字符,后来问了同学,才明白原来有这么一个函数,顿时豁然开朗。
词法分析实验报告文献
一、实验目的1. 深入理解词法分析的基本原理和过程。
2. 掌握词法分析器的设计与实现方法。
3. 熟悉C语言编程,并能够将其应用于词法分析程序的开发。
4. 培养问题分析和解决能力,提高编程技能。
二、实验原理词法分析是编译过程中的第一步,其主要任务是将源程序中的字符序列转换为一系列具有独立意义的单词符号(Token)。
词法分析器通过识别单词的构词规则,将源程序分解为一个个单词符号,为后续的语法分析和语义分析提供基础。
三、实验内容1. 词法分析器的设计本实验采用C语言实现一个简单的词法分析器,主要功能如下:- 识别并分类单词符号,包括关键字、标识符、常量、运算符和界符等。
- 对输入的源程序进行词法分析,输出每个单词符号及其对应的种别码。
- 处理词法错误,并给出错误提示。
2. 词法分析器的实现(1)数据结构- 关键字表:存储C语言中的关键字。
- 标识符表:存储用户自定义的标识符。
- 常量表:存储整型常量。
- 运算符表:存储C语言中的运算符。
- 界符表:存储C语言中的界符。
(2)主要函数- `isLetter(char c)`:判断字符是否为字母。
- `isDigit(char c)`:判断字符是否为数字。
- `alpha(char c)`:识别字母。
- `number(char c)`:识别整数。
- `anotation(char c)`:处理除号、注释以及其他特殊字符。
- `other(char c)`:处理其他字符。
(3)词法分析过程- 读取源程序中的字符。
- 根据字符类型调用相应的函数进行识别。
- 将识别出的单词符号及其种别码存储在相应的表中。
四、实验步骤1. 编写源程序,实现词法分析器。
2. 编写测试用例,对词法分析器进行测试。
3. 分析测试结果,验证词法分析器的正确性。
五、实验结果与分析1. 测试用例- 测试用例1:包含关键字、标识符、常量、运算符和界符的简单C程序。
- 测试用例2:包含错误标识符和运算符的C程序。
编译原理实验词法分析实验报告
编译技术实验报告实验题目:词法分析学院:信息学院专业:计算机科学与技术学号:姓名:一、实验目的(1)理解词法分析的功能;(2)理解词法分析的实现方法;二、实验内容PL0的文法如下‘< >’为非终结符。
‘::=’ 该符号的左部由右部定义,可读作“定义为”。
‘|’ 表示‘或’,为左部可由多个右部定义。
‘{ }’ 表示花括号内的语法成分可以重复。
在不加上下界时可重复0到任意次数,有上下界时可重复次数的限制。
‘[ ]’ 表示方括号内的成分为任选项。
‘( )’ 表示圆括号内的成分优先。
上述符号为“元符号”,文法用上述符号作为文法符号时需要用引号‘’括起。
〈程序〉∷=〈分程序〉.〈分程序〉∷= [〈变量说明部分〉][〈过程说明部分〉]〈语句〉〈变量说明部分〉∷=VAR〈标识符〉{,〈标识符〉}:INTEGER;〈无符号整数〉∷=〈数字〉{〈数字〉}〈标识符〉∷=〈字母〉{〈字母〉|〈数字〉}〈过程说明部分〉∷=〈过程首部〉〈分程序〉{;〈过程说明部分〉};〈过程首部〉∷=PROCEDURE〈标识符〉;〈语句〉∷=〈赋值语句〉|〈条件语句〉|〈过程调用语句〉|〈读语句〉|〈写语句〉|〈复合语句〉|〈空〉〈赋值语句〉∷=〈标识符〉∶=〈表达式〉〈复合语句〉∷=BEGIN〈语句〉{;〈语句〉}END〈条件〉∷=〈表达式〉〈关系运算符〉〈表达式〉〈表达式〉∷=〈项〉{〈加法运算符〉〈项〉}〈项〉∷=〈因子〉{〈乘法运算符〉〈因子〉}〈因子〉∷=〈标识符〉|〈无符号整数〉|'('〈表达式〉')'〈加法运算符〉∷=+|-〈乘法运算符〉∷=*〈关系运算符〉∷=<>|=|<|<=|>|>=〈条件语句〉∷=IF〈条件〉THEN〈语句〉〈字母〉∷=a|b|…|X|Y|Z〈数字〉∷=0|1|2|…|8|9实现PL0的词法分析三、实验分析与设计PL0词法分析程序是一个独立的过程,其功能是为语法语义分析提供单词,把输入的字符串形式的源程序分割成一个个单词符号传递给语法语义分析。
词法分析报告
编译原理实验报告实验一词法分析程序的设计与实现指导教师:姓名:学号:班级:一、实验目的基本掌握计算机语言的词法分析程序的开发方法。
二、实验内容编制一个能够分析三种整数、标识符、主要运算符和主要关键字的词法分析程序。
三、实验要求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中没有空格,但这是三个单词。
词法分析程序实验报告
词法分析程序实验报告词法分析程序实验报告一、实验目的1. 理解词法分析器的基本功能2. 理解词法规则的描述方法3. 理解状态转换图及其实现4. 能够编写简单的词法分析器二、实验要求给出单词序列对应的状态识别。
单词符号State 对应的值单词符号State 对应的值function 1 = 18if 2 < 20else 3 <= 21for 4 != 22then 5 > 23while 6 >= 24do 7 == 25 endfunction 8 ; 26letter(letter|digit)* 10 ( 27digit digit* 11 ) 28+ 13 { 29- 14 } 30* 15 # 0/ 162、主程序流程图N程序开始初始化输入源程序调用scanner()函数,识别单词序列输出单词序列Y结束输入串结束?三、识别单词的状态转换图Scanner()函数流程图变量初始化忽略空格和换行num 读取常数state=11Token[]读入关键字、标识符关键字?判断关键字 statestate=10判断运算符和分界符 state 其余符号 state=-1 ReturnNY{)(;其他其他===其他!其他</* - + 非数字数字数字开始空格或换行字母0 1返回’10’或关键字234 返回’11’567 8返回’13’ 返回’14’ 返回’15’ 返回’16’ 910111213 14 1516171819 20 >=222425返回’20’返回’21’返回’-1’返回’22’ 返回’23’ 返回’24’返回’18’返回’25’ 返回’26’ 返回’27’ 返回’28’ 返回’29’} #2. 分析直接转向法和表驱动法的优缺点状态转换图的实现通常有两种方法:状态转换表和直接转向法(1) :状态转换表法又称数据中心,是把状态转换图看作一种数据结构,由控制程序控制字符在其上运行,从而完成词法分析。
词法分析器实验报告
词法分析器实验报告一、实验目的本实验旨在通过构建一个简单的词法分析器来加深对编译原理中词法分析的理解,并掌握基本的词法分析算法和程序设计技巧。
二、实验环境操作系统:Windows 10编程语言:C/C++开发环境:Visual Studio 2019三、实验内容1. 设计并实现一个词法分析器,要求具备以下功能:(1)能够识别并区分关键字、标识符、字符常量、字符串常量、整型常量和浮点型常量等基本单词;(2)能够跳过注释、空格、制表符和换行符等无用字符;(3)能够给出错误提示并指明错误所在位置。
2. 对设计的词法分析器进行测试,并记录测试结果,分析测试结果的正确性和效率。
四、实验方法1. 分析待处理的源程序,并确定需要识别的词法单元;2. 设计状态转换图或状态转换表,并将其转化为程序代码;3. 开发测试程序,对所设计的词法分析器进行测试。
五、实验结果1. 实现的词法分析器程序可以正确识别出源程序中的各个单词,并能够跳过无用字符;2. 在测试过程中发现了一些错误,比如未能正确识别一些特殊情况下的单词,或者给出了错误的错误提示等。
经过修改后,程序可以正确识别这些情况,并给出正确的错误提示信息;3. 程序的效率较高,能够在短时间内对源程序进行词法分析。
六、实验体会通过本次实验,我对编译原理中词法分析的概念、算法和程序设计技巧有了更加深入的了解和掌握。
在实践中,我遇到了许多问题,比如如何设计状态转换图,如何正确识别一些特殊的单词等。
这些问题一一解决后,我对词法分析有了更加深刻的理解。
通过本次实验,我还深刻体会到了编译器设计过程中的思维方式和技术要求。
编译器是计算机科学中的一项重要技术,对于提高程序运行效率、保证程序安全性、增强程序可读性和扩展程序功能等都有重要作用。
因此,编译原理作为计算机科学的重要组成部分,对于我以后的学习和研究具有重要意义。
实现词法分析实验报告
实现词法分析实验报告一、实验目的本次实验的目的是通过编写代码实现一个简单的词法分析器,可以对一段输入的代码进行词法分析,识别出其中的各种标识符、关键字、常数和运算符等。
二、实验原理词法分析是编译过程中的第一个阶段,它负责将源代码按照规定的规则划分为一个个的单词(Token),每个单词代表一个最基本的语法单元。
在词法分析中,我们通过预先定义好的正则表达式规则来描述各个单词类型,并自动从源代码中提取出这些单词。
本次实验采用基于正则表达式的文法描述方式,针对不同的单词类型,使用不同的正则表达式来匹配。
通过遍历源代码字符串,逐一尝试匹配各个正则表达式,从而实现对单词的划分。
在匹配过程中,我们使用一个状态机来记录当前的匹配状态,以便处理不同的情况。
三、实验过程1. 定义Token的数据结构,包括单词类型和单词值两个字段。
使用枚举类型来表示所有的单词类型,如关键字、标识符、常数等。
2. 编写正则表达式的匹配函数,用于判断给定的字符串是否符合某个模式。
在这个函数中,使用系统提供的正则表达式库或者手动实现正则表达式匹配算法。
3. 设计一个状态机,用于记录当前匹配的状态。
状态机的状态包括开始、正在匹配、匹配成功和匹配失败等。
在状态机中,根据当前字符和当前状态进行不同的处理。
4. 在状态机中,当一个完整的Token被匹配出时,根据其类型和值创建一个Token对象,并将其添加到Token列表中。
5. 将源代码字符串按照换行符划分成多行,逐行进行处理。
对于每一行,调用状态机进行匹配,将得到的Token添加到Token列表中。
6. 输出Token列表,观察结果。
四、实验结果经过实验,我们成功实现了一个简单的词法分析器。
通过对输入的代码进行词法分析,我们可以得到每个单词的类型和值。
在本次实验中,我们测试了一段C语言代码,并成功提取出其中的关键字、标识符、常数和运算符等。
五、实验总结本次实验让我初步了解了词法分析的原理和过程。
词法分析实验报告
编译原理实验报告实验名称:______编译原理词法分析___实验类型:________________________ _指导教师:___ 曾立胜______________ 专业班级:___ _软件1105________ ___ 姓名:_____ 王永强______________ 学号:______ 20111598____________ 实验地点:______东六E109___ ________ 实验成绩:____________________________日期:2013 年4 月2日实验一词法分析一、实验目的运用理论课中的知识编写一段程序,此程序能对于给定的源程序,从组成源程序的字符行中寻找出单词,并给出它们的种别和属性——输出二元组序列。
以便提供给语法分析的时候使用。
要求能识别所有的关键字,标志符等,并且能够对出先的一些词法规则的错误进行判断和必要的处理。
通过此次试验能对实验环境更加熟悉,对程序的编写和调试更加熟练,能把理论知识和代码相结合。
二、实验设计1.原理:读入源程序,得到单词表如图所示源程序单词表2.设计方法:在扫描源程序字符串时一旦识别出关键字、分隔符、标识符、无符号之一,即以单词形式,各类单词均采用相同的结构,即二元式编码形式存储。
每次调用词法分析程序,它均能自动继续扫描下去,形成下一个单词,直至整个源程序全部扫描完毕并形成相应的单词表。
3.设计过程:通过test语言的词法规则,把规则转化为一种方法,再将此方法用代码编写出来。
4.设计结果:得到一个能识别test语言词法的源程序代码,可以通过此代码分析由test语言编写的源程序是否有语法错误,并且指出错误位置。
最终得到与源程序代码对应的单词表,为接下来的语法分析和语义分析奠基。
三、实验过程过程:1.根据书中test语言代码,得到一个基本的词法分析代码。
2.根据实验要求,修改词法分析代码得到符合要求的代码。
3.修改过程中遇到问题,及时更正。
词法分析器实验报告_5
一、实验目的1.1总体目的1.1.1 掌握词法分析的基本原理;1.1.2.理解词法分析在编译程序过程中的作用;1.1.3.熟悉关键字表等相关的数据结构与单词的分类方法.1.1.4.加深对编译原理的理解,掌握词法分析器的实现方法和技术,同时,将JA V A 的理论知识结合实际,锻炼编程技术,强调良好的程序设计风格。
1.2程序目的利用JAVA语言针对C语言编制一个一遍扫描的编译程序。
从文件中识别出各个单词, 识别出所取的单词的类型, 并且对代码中的词法错误进行提示。
二、实验内容根据编译原理中的词法分析原理, 利用Java语言针对C语言编写一个词法分析程序: 输入: 打开一个C语言程序的源代码文件, 将其读入程序输入框。
处理: 对输入框中的代码进行词法分析,分离出关键字、标识符、数值、运算符和界符。
输出:在词法分析结果表中输出每个单词所在行号、类型以及它所对应的编码。
其中, 编码是自定义的,一种类型对应一组编码。
词法分析结果显示在词法分析错误信息栏, 提示错误个数、错误所在行号, 并对某些词法错误原因进行说明。
三、实验需求针对C语言程序代码进行词法分析器, 从指定文件中读入预分析的源程序, 从左至右扫描源程序的字符串, 按照词法规则(正则文法规则)识别出一个个正确的单词, 并转换成该单词相应的二元式(种别码、属性值)以便之后进行语法分析使用。
同时, 按照给定的规则, 识别出单词符号作为输出, 发现其中的语法错误, 不同类别的字符通过相应的函数模块来分析识别, 使程序能够正确识别文法所规定的任何组织形式的字符组合, 将所有的分析状态显示在词法分析器中。
最后在错误分析栏中显示该文件中C语言代码的词法错误个数、错误所在行, 并对错误原因进行说明。
四、主要数据结构介绍4.1关键字编码4.2标识符统一编码1004.3数值统一编码2004.4界符编码4.5运算符编码4.6全局变量含义int row: 语法错误出现的所在列数int line: 语法错误出现的所在行数int err: 语法错误的个数int begin: 当前程序扫描在字符串中的开始位置int end: 当前程序扫描在字符串中的结束位置4.7局部变量定义int i: 选择第i 个字符进行检测 int state: 单词类型判断标志 int N: 文件长度char c: 当前遍历的字符 string str: 输入字符串 int flag: 退出标志五、主要模块算法介绍5.1总体流程介绍说明: state 为输入字符状态标志, 根据输入字符不同类型选择不同处理。
编译原理实验词法分析实验报告
编译原理实验词法分析实验报告一、实验目的词法分析是编译过程中的第一个阶段,其主要任务是从输入的源程序中识别出具有独立意义的单词符号,并将其转换为内部编码形式。
本次实验的目的是通过设计和实现一个简单的词法分析程序,深入理解词法分析的基本原理和方法,提高对编程语言语法结构的认识和编程能力。
二、实验原理词法分析的基本原理是根据编程语言的词法规则,使用有限自动机或正则表达式等技术来识别单词符号。
在本次实验中,我们采用了状态转换图的方法来设计词法分析器。
状态转换图是一种用于描述有限自动机的图形表示方法,它由状态节点和有向边组成。
每个状态节点表示自动机的一个状态,有向边表示状态之间的转换条件。
当输入字符与当前状态的转换条件匹配时,自动机将从当前状态转换到下一个状态。
当到达一个终态时,表示识别出了一个单词符号。
三、实验环境本次实验使用了 Python 编程语言,并在 PyCharm 集成开发环境中进行开发和调试。
四、实验内容1、定义单词符号的种类和编码关键字:如`if`、`else`、`while` 等标识符:由字母、数字和下划线组成,且以字母或下划线开头常数:包括整数和浮点数运算符:如`+`、``、``、`/`等分隔符:如`(){},;`等2、设计状态转换图根据单词符号的定义,设计了相应的状态转换图,用于识别不同类型的单词符号。
例如,对于标识符的识别,从起始状态开始,当输入字符为字母或下划线时,进入标识符状态,继续输入字母、数字或下划线,直到遇到非标识符字符为止,此时到达终态,识别出一个标识符。
3、实现词法分析程序使用 Python 语言实现了基于状态转换图的词法分析程序。
程序首先读取输入的源程序文本,然后逐个字符进行处理,根据当前状态和输入字符进行状态转换,当到达终态时,输出识别出的单词符号及其编码。
4、进行测试编写了一些测试用例,包括包含各种单词符号的源程序代码。
运行词法分析程序对测试用例进行分析,检查输出结果是否正确。
编译词法分析实验报告
一、实验目的1. 理解词法分析的基本概念和原理。
2. 掌握词法分析器的实现方法。
3. 熟悉C语言在词法分析中的应用。
4. 提高编程能力和问题解决能力。
二、实验环境1. 操作系统:Windows 102. 编程语言:C3. 开发环境:Visual Studio 2019三、实验内容1. 设计词法分析器,实现对源代码的词法分析。
2. 将源代码分解为单词序列。
3. 输出单词序列及对应的词法类型。
四、实验步骤1. 分析源代码中的词法单位,确定词法类型。
2. 设计词法分析器的状态转换表。
3. 编写词法分析器代码。
4. 测试词法分析器,验证其正确性。
五、实验过程1. 分析源代码中的词法单位在C语言中,词法单位包括标识符、关键字、运算符、分隔符、常量等。
本实验以C语言为例,分析源代码中的词法单位,确定词法类型。
2. 设计词法分析器的状态转换表根据词法单位,设计词法分析器的状态转换表。
状态转换表包括当前状态、输入字符、下一状态、输出词法类型和对应动作。
3. 编写词法分析器代码根据状态转换表,编写词法分析器代码。
以下为词法分析器的主要功能模块:(1)初始化:设置初始状态、词法类型和单词长度。
(2)读取字符:从源代码中读取字符,并判断字符类型。
(3)状态转换:根据状态转换表,更新当前状态、输出词法类型和单词长度。
(4)输出结果:将单词序列及对应的词法类型输出到屏幕。
4. 测试词法分析器编写测试用例,验证词法分析器的正确性。
测试用例包括以下几种情况:(1)包含各种词法单位的源代码。
(2)包含注释的源代码。
(3)包含错误标识符的源代码。
六、实验结果与分析1. 实验结果通过测试,词法分析器能够正确识别源代码中的各种词法单位,并将单词序列及对应的词法类型输出到屏幕。
以下为部分测试结果:```int a = 10; // 输出:int, 标识符if (a > 0) // 输出:if, 关键字{// 输出:{, 分隔符// ...// 输出:}, 分隔符}// 输出://, 注释开始注释内容// 输出://, 注释结束```2. 实验分析(1)实验过程中,通过对词法分析原理的学习,加深了对编译原理的理解。
词法分析~实验报告
词法分析~实验报告实验⼀、词法分析实验专业商业软件3班姓名陈笑璞学号 201506110218⼀、实验⽬的(1)编制⼀个词法分析程序(2)词法分析是编译的第⼀个阶段,主要任务是从左⾄右逐个字符地对源程序进⾏扫描,产⽣⼀个个单词序列,⽤于语法分析。
(3)通过词法分析的练习,能够进⼀步了解编译原理。
(4)通过了解词法分析程序的设计原则、单词的描述技术、识别机制及词法分析程序的⾃动构造原理。
⼆、实验内容和要求(1)输⼊:源程序字符串(2)输出:⼆元组(种别,单词符号本⾝)。
三、实验⽅法、步骤及结果测试实验⽅法、步骤:(1)对字符串表⽰的源程序(2)从左到右进⾏扫描和分解(3)根据词法规则(4)识别出⼀个⼀个具有独⽴意义的单词符号(5)以供语法分析之⽤(6)发现词法错误,则返回出错信息2、原理分析: 我的设计思路是利⽤链队列(好处:先进先出且不浪费存储空间)进⾏存储⽤户输⼊字符串,以回车键结束(其中必须以⾮数字结尾,否则程序出错)(这是我在后来的编程⾥遇到的问题,我知道问题出在哪⾥,但我现在还解决不了,因为我是通过申请⼦针域来存储,所以我是利⽤p->next来作为判断结束条件,如果以数字结束,那p->next指向未知领域,程序出错,同时这也是很危险的),然后我是利⽤出队列来判断,如果是字母存进数组⾥,直到下⼀个字符不是字母,调⽤函数判断数组的字符串,利⽤strcmp来判断,输出数组,再清空数组;void Print(char str[])//调⽤函数来判断关键字与标识符并输出{int i=0;if(strcmp(str,"begin")==0)printf("(1,'%s')\n",str);else if(strcmp(str,"if")==0)printf("(2,'%s')\n",str);else if(strcmp(str,"then")==0)printf("(3,'%s')\n",str);else if(strcmp(str,"while")==0)printf("(4,'%s')\n",str);else if(strcmp(str,"do")==0)printf("(5,'%s')\n",str);else if(strcmp(str,"end")==0)printf("(6,'%s')\n",str);else{if(str[0]=='\0')return;printf("(10,'%s')\n",str);}memset(str,0,N);//清空数组str⾥的所有元素}结果测试:四、实验总结说实话,通过这次的编译原理词法分析的实验,我遇到了不少问题,也学到了不少的东西,因为这次实验我是想⽤我⾃⼰的想法来编写程序,我是⽤链队列来存储字符串的,也许⽤数组来存储字符串会简单点,但我不想,我还是想利⽤链队列来存储字符串,这样可以节约存储空间,还可以利⽤队列先进先出的特点,不好就是利⽤队列不够灵活,每次都要出栈判断、存储,释放p的⼦针域;虽然在编写过程中,遇到不少问题,遇到⼀个,就想办法解决⼀个,通过问朋友⽼师等,也通过发朋友圈问,还通过发博客来问⼤神们,这种途径是最有效的,也是最好的;所以每次就差⼀点就做好了,⼜会遇到⼀个新的问题,就要想办法去解决它,如今除了字符串是以数字结尾会出现问题外(暂时没找到好的⽅法),其他问题已解决。
词法分析的实验报告
《词法分析》实验报告目录目录 (1)1 实验目的 (2)2 实验容 (2)2.1 TINY计算机语言描述 (2)2.2 实验要求 (2)3 此法分析器的程序实现 (3)3.1 状态转换图 (3)3.2 程序源码 (4)3.3 实验运行效果截图 (9)4 实验体会 (10)1实验目的1、学会针对DFA转换图实现相应的高级语言源程序。
2、深刻领会状态转换图的含义,逐步理解有限自动机。
3、掌握手工生成词法分析器的方法,了解词法分析器的部工作原理。
2实验容2.1TINY计算机语言描述TINY计算机语言的编译程序的词法分析部分实现。
从左到右扫描每行该语言源程序的符号,拼成单词,换成统一的部表示(token)送给语法分析程序。
为了简化程序的编写,有具体的要求如下:1、数仅仅是整数。
2、空白符仅仅是空格、回车符、制表符。
3、代码是自由格式。
4、注释应放在花括号之,并且不允许嵌套TINY语言的单词2.2实验要求要现编译器的以下功能1、按规则拼单词,并转换成二元式形式2、删除注释行3、删除空白符 (空格、回车符、制表符)4、列表打印源程序,按照源程序的行打印,在每行的前面加上行号,并且打印出每行包含的记号的二元形式5、发现并定位错误词法分析进行具体的要求1、记号的二元式形式中种类采用枚举方法定义;其中保留字和特殊字符是每个都一个种类,标示符自己是一类,数字是一类;单词的属性就是表示的字符串值。
2、词法分析的具体功能实现是一个函数GetToken(),每次调用都对剩余的字符串分析得到一个单词或记号识别其种类,收集该记号的符号串属性,当识别一个单词完毕,采用返回值的形式返回符号的种类,同时采用程序变量的形式提供当前识别出记号的属性值。
这样配合语法分析程序的分析需要的记号及其属性,生成一个语法树。
3、标示符和保留字的词法构成相同,为了更好的实现,把语言的保留字建立一个表格存储,这样可以把保留字的识别放在标示符之后,用识别出的标示符对比该表格,如果存在该表格中则是保留字,否则是一般标示符。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
编译原理实验一姓名:朱彦荣学号:20132184 专业:软件工程2 实验题目:词法分析完成语言:C/C++上级系统:VC++6.0日期:2015/11/7词法分析设计题目:手工设计c语言的词法分析器(可以是c语言的子集)设计容:处理c语言源程序,过滤掉无用符号,判断源程序中单词的合法性,并分解出正确的单词,以二元组形式存放在文件中。
设计目的:了解高级语言单词的分类,了解状态图以及如何表示并识别单词规则,掌握状态图到识别程序的编程。
结果要求:课程设计报告。
完成日期:第十五周提交报告一.分析要想手工设计词法分析器,实现C语言子集的识别,就要明白什么是词法分析器,它的功能是什么。
词法分析是编译程序进行编译时第一个要进行的任务,主要是对源程序进行编译预处理(去除注释、无用的回车换行找到包含的文件等)之后,对整个源程序进行分解,分解成一个个单词,这些单词有且只有五类,分别是标识符、保留字、常数、运算符、界符。
以便为下面的语法分析和语义分析做准备。
可以说词法分析面向的对象是单个的字符,目的是把它们组成有效的单词(字符串);而语法的分析则是利用词法分析的结果作为输入来分析是否符合语法规则并且进行语法制导下的语义分析,最后产生四元组(中间代码),进行优化(可有可无)之后最终生成目标代码。
可见词法分析是所有后续工作的基础,如果这一步出错,比如明明是‘<=’却被拆分成‘<’和‘=’就会对下文造成不可挽回的影响。
因此,在进行词法分析的时候一定要定义好这五种符号的集合。
下面是我构造的一个C语言子集。
第一类:标识符 letter(letter | digit)* 无穷集第二类:常数 (digit)+ 无穷集第三类:保留字(32)auto break case char const continuedefault do double else enum externfloat for goto if int longregister return short signed sizeof staticstruct switch typedef union unsigned voidvolatile while第四类:界符‘/*’、‘//’、 () { } [ ] " " ' 等第五类:运算符 <、<=、>、>=、=、+、-、*、/、^、等对所有可数符号进行编码:<$,0><auto,1>...<while,32><+,33><-,34><*,35></,36><<,37><<=,38><>,39><>=,40><=,41><==,42><!=,43><;,44><(,45><),46><^,47><,,48><",49><',50><#,51><&,52><&&,53><|,54><||,55><%,56><~,57><<<,58>左移<>>,59>右移<[,60><],61><{,62><},63><\,64><.,65><?,66><:,67><!,68> "[","]","{","}"<常数99 ,数值><标识符100 ,标识符指针>上述二元组中左边是单词的符号,右边为其种别码,其中常数和标识符有点特别,因为是无穷集合,因此常数用自身来表示,种别码为99,标识符用标识符符号表的指针表示(当然也可用自身显示,比较容易观察),种别码100。
根据上述约定,一旦见到了种别码syn=63,就唯一确定了‘}’这个单词。
下面是一些变量的约定://全局变量,保留字表static char reserveWord[32][20] = {"auto", "break", "case", "char", "const", "continue","default", "do", "double", "else", "enum", "extern","float", "for", "goto", "if", "int", "long","register", "return", "short", "signed", "sizeof", "static","struct", "switch", "typedef", "union", "unsigned", "void","volatile", "while"};//界符运算符表,根据需要可以自行增加static char operatorOrDelimiter[36][10]={"+","-","*","/","<","<=",">",">=","=","==","!=",";","(",")","^",",","\"","\'","#","&","&&","|","||","%","~","<<",">>","[","]","{","}","\\",".","\?",":","!"};static char IDentifierTbl[1000][50]={""};//标识符表char resourceProject[10000];//输入的源程序存放处,最大可以存放10000个字符。
char token[20]={0};//每次扫描的时候存储已经扫描的结果。
int syn=-1;//syn即为种别码,约定‘$’的种别码为0,为整个源程序的结束符号一旦扫描到这个字符代表扫描结束int pProject = 0;//源程序指针,始终指向当前源程序待扫描位置。
几个重要函数://查找保留字,若成功查找,则返回种别码//否则返回-1,代表查找不成功,即为标识符int searchReserve(char reserveWord[ ][20], char s[])/*********************判断是否为字母********************/bool IsLetter(char letter)/*****************判断是否为数字************************/bool IsDigit(char digit)/********************编译预处理,取出无用的字符和注释**********************/void filterResource(char r[],int pProject)/****************************分析子程序,算法核心***********************/void Scanner(int &syn,char resourceProject[],char token[],int &pProject) 下面说一下整个程序的流程:1.词法分析程序打开源文件,读取文件容,直至遇上’$’文件结束符,然后读取结束。
2.对读取的文件进行预处理,从头到尾进行扫描,去除//和/* */的容,以及一些无用的、影响程序执行的符号如换行符、回车符、制表符等。
但是千万注意不要在这个时候去除空格,因为空格在词法分析中有用,比如说int i=3;这个语句,如果去除空格就变成了“inti=3”,这样就失去了程序的本意,因此不能在这个时候去除空格。
3.选下面就要对源文件从头到尾进行扫描了,从头开始扫描,这个时候扫描程序首先要询问当前的字符是不是空格,若是空格,则继续扫描下一个字符,直至不是空格,然后询问这个字符是不是字母,若是则进行标识符和保留字的识别;若这个字符为数字,则进行数字的判断。
否则,依次对这个字符可能的情况进行判断,若是将所有可能都走了一遍还是没有知道它是谁,则认定为错误符号,输出该错误符号,然后结束。
每次成功识别了一个单词后,单词都会存在token[ ]中。
然后确定这个单词的种别码,最后进行下一个单词的识别。
这就是扫描程序进行的工作,可以说这个程序彻底实现了确定有限自动机的某些功能,比如说识别标识符,识别数字等。
为了简单起见,这里的数字只是整数。
4.主控程序主要负责对每次识别的种别码syn进行判断,对于不同的单词种别做出不同的反应,如对于标识符则将其插入标识符表中。
对于保留字则输出该保留字的种别码和助记符,等等吧。