词法分析程序实验报告

合集下载

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

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

编译原理词法分析实验报告实验名称:词法分析器的设计与实现一、实验目的: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对象。

五、实验总结:通过本次实验,我熟悉了编译原理中词法分析的基本概念和原理,并掌握了正则表达式的使用方法。

我成功完成了一个简单的词法分析器的设计与实现,实现了源代码中每个词法单元的识别与输出。

这次实验对我深化了对编译原理中词法分析的理解,并提高了我的编程能力。

词法分析实验报告

词法分析实验报告

词法分析实验报告词法分析实验报告引言词法分析是自然语言处理中的一个重要环节,它负责将输入的文本分割成一个个的词语,并确定每个词语的词性。

本次实验旨在通过实现一个简单的词法分析器,来探索词法分析的原理和实践。

实验内容本次实验中,我们使用Python编程语言来实现词法分析器。

我们选取了一段简单的英文文本作为输入,以便更好地理解和演示词法分析的过程。

1. 文本预处理在进行词法分析之前,我们首先需要对输入文本进行预处理。

预处理的目的是去除文本中的标点符号、空格和其他无关的字符,以便更好地进行后续的分词操作。

2. 分词分词是词法分析的核心步骤之一。

在这个步骤中,我们将文本分割成一个个的词语。

常见的分词方法包括基于规则的分词和基于统计的分词。

在本次实验中,我们选择了基于规则的分词方法。

基于规则的分词方法通过事先定义一系列的分词规则来进行分词。

这些规则可以是基于语法的,也可以是基于词典的。

在实验中,我们使用了一个简单的基于词典的分词规则,即根据英文单词的常见前缀和后缀来进行分词。

3. 词性标注词性标注是词法分析的另一个重要步骤。

在这个步骤中,我们为每个词语确定其词性。

词性标注可以通过事先定义的规则和模型来进行。

在本次实验中,我们使用了一个简单的基于规则的词性标注方法。

基于规则的词性标注方法通过定义一系列的词性标注规则来进行词性标注。

这些规则可以是基于词法的,也可以是基于语法的。

在实验中,我们使用了一个简单的基于词法的词性标注规则,即根据英文单词的后缀来确定其词性。

实验结果经过实验,我们得到了输入文本的分词结果和词性标注结果。

分词结果如下:- I- love- natural- language- processing词性标注结果如下:- I (代词)- love (动词)- natural (形容词)- language (名词)- processing (名词)讨论与总结通过本次实验,我们深入了解了词法分析的原理和实践。

词法分析器实验报告

词法分析器实验报告

词法分析器实验报告引言:词法分析器(Lexical Analyzer)是编译器的重要组成部分,其主要任务是将源代码转化为一个个独立的词法单元,为语法分析器提供输入。

在本次实验中,我们设计并实现了一个简单的词法分析器,通过对其功能和性能的测试,评估其在不同场景下的表现。

实验目的:1. 确定词法分析器的输入和输出要求;2. 通过构建适当的正则表达式规则,匹配不同类型的词法单元;3. 实现一个高效的词法分析器,确保在处理大型源代码时性能不受影响;4. 对词法分析器的功能和性能进行测试和评估。

实验过程:1. 设计词法分析器的接口:1.1 确定输入:源代码字符串。

1.2 确定输出:词法单元流,每个词法单元包含类型和对应的字符串值。

2. 构建正则表达式规则:2.1 识别关键字:根据编程语言的关键字列表构建正则表达式规则,将关键字与标识符区分开。

2.2 识别标识符:一般由字母、下划线和数字组成,且以字母或下划线开头。

2.3 识别数字:整数和浮点数可以使用不同的规则来识别。

2.4 识别字符串:使用引号(单引号或双引号)包裹的字符序列。

2.5 识别特殊符号:各类操作符、括号、分号等特殊符号需要单独进行规则设计。

3. 实现词法分析器:3.1 读取源代码字符串:逐个字符读取源代码字符串,并根据正则表达式规则进行匹配。

3.2 保存词法单元:将匹配到的词法单元保存到一个词法单元流中。

3.3 返回词法单元流:将词法单元流返回给调用者。

4. 功能测试:4.1 编写测试用例:针对不同类型的词法单元编写测试用例,包括关键字、标识符、数字、字符串和特殊符号。

4.2 执行测试用例:将测试用例作为输入传递给词法分析器,并检查输出是否和预期一致。

4.3 处理错误情况:测试词法分析器对于错误输入的处理情况,如非法字符等。

5. 性能测试:5.1 构建大型源代码文件:生成包含大量代码行数的源代码文件。

5.2 执行词法分析:使用大型源代码文件作为输入,测试词法分析器的性能。

【编译原理】词法分析(CC++源代码+实验报告)

【编译原理】词法分析(CC++源代码+实验报告)

【编译原理】词法分析(CC++源代码+实验报告)⽂章⽬录1 实验⽬的和内容1.1实验⽬的(1)根据 PL/0 语⾔的⽂法规范,编写PL/0语⾔的词法分析程序;或者调研词法分析程序的⾃动⽣成⼯具LEX或FLEX,设计并实现⼀个能够输出单词序列的词法分析器。

(2)通过设计调试词法分析程序,实现从源程序中分离出各种类型的单词;加深对课堂教学的理解;提⾼词法分析⽅法的实践能⼒。

(3)掌握从源程序⽂件中读取有效字符的⽅法和产⽣源程序的内部表⽰⽂件的⽅法。

(4)掌握词法分析的实现⽅法。

(5)上机调试编出的词法分析程序。

1.2实验内容根据PL/0语⾔的⽂法规范,编写PL/0语⾔的词法分析程序。

要求:(1)把词法分析器设计成⼀个独⽴⼀遍的过程。

(2)词法分析器的输出形式采⽤⼆元式序列,即:(单词种类, 单词的值)2 设计思想2.1单词种类及其正规式(1)基本字单词的值单词类型正规式rbegin beginsym begincall callsym callconst constsym constdo dosym doend endsym endif ifsym ifodd oddsym oddprocedure proceduresym procedureread readsym readthen thensym thenvar varsym varwhile whilesym whilewrite writesym write(2)标识符单词的值单词类型正规式r标识符ident(字母)(字母|数字)*(3)常数单词的值单词类型正规式r常数number(数字)(数字)*(4)运算符单词的值单词类型正规式r+plus+-minus-*times*/slash/=eql=<>neq<><lss<<=leq<=>gtr>>=geq>=:=becomes:=(5)界符单词的值单词类型正规式r(lparen()rparen),comma,;semicolon;.period.2.2 根据正规式构造NFA下⾯我们根据上述的正规式来构造该⽂法的NFA,如下图所⽰,其中状态0为初态,凡带双圈的状态均为终态,状态24是识别不出单词符号的出错情形,其他状态的识别情况如下图中右边的注释所⽰。

词法分析实验报告代码

词法分析实验报告代码

一、实验目的1. 理解词法分析的概念和作用。

2. 掌握词法分析器的设计和实现方法。

3. 通过实验加深对编译原理中词法分析阶段的理解。

二、实验环境1. 操作系统:Windows 102. 编程语言:Python3.83. 开发工具:PyCharm三、实验内容1. 设计一个简单的词法分析器,能够识别并输出源代码中的单词。

2. 实现词法分析器的关键功能,包括:- 字符串预处理- 单词识别- 生成词法分析表四、实验步骤1. 字符串预处理- 读取源代码字符串。

- 移除字符串中的空白字符(空格、制表符、换行符等)。

- 转义字符串中的特殊字符。

2. 单词识别- 使用正则表达式匹配单词。

- 根据正则表达式匹配结果,将单词分类为关键字、标识符、常量等。

3. 生成词法分析表- 创建一个列表,用于存储词法分析表中的每个单词及其对应的类别。

- 遍历源代码字符串,将识别出的单词添加到词法分析表中。

五、实验代码```pythonimport re# 定义词法分析表结构class Token:def __init__(self, type, value):self.type = typeself.value = value# 单词识别函数def tokenize(source_code):# 移除空白字符source_code = re.sub(r'\s+', '', source_code)# 转义特殊字符source_code = re.sub(r'\\', '\\\\', source_code)# 使用正则表达式匹配单词tokens = re.findall(r'\b\w+\b', source_code)# 生成词法分析表token_table = []for token in tokens:if re.match(r'\bint\b', token):token_table.append(Token('KEYWORD', token))elif re.match(r'\bfloat\b', token):token_table.append(Token('KEYWORD', token))elif re.match(r'\bchar\b', token):token_table.append(Token('KEYWORD', token))elif re.match(r'\bif\b', token):token_table.append(Token('KEYWORD', token))elif re.match(r'\belse\b', token):token_table.append(Token('KEYWORD', token))elif re.match(r'\breturn\b', token):token_table.append(Token('KEYWORD', token))elif re.match(r'\b\w+\b', token):token_table.append(Token('IDENTIFIER', token)) else:token_table.append(Token('CONSTANT', token)) return token_table# 主函数def main():# 读取源代码source_code = '''int main() {int a = 10;float b = 3.14;char c = 'A';if (a > b) {return a;} else {return b;}}'''# 进行词法分析token_table = tokenize(source_code)# 输出词法分析结果for token in token_table:print(f'Type: {token.type}, Value: {token.value}') if __name__ == '__main__':main()```六、实验结果运行实验代码后,输出如下:```Type: KEYWORD, Value: intType: IDENTIFIER, Value: mainType: KEYWORD, Value: (Type: KEYWORD, Value: )Type: KEYWORD, Value: intType: IDENTIFIER, Value: a Type: KEYWORD, Value: = Type: CONSTANT, Value: 10 Type: KEYWORD, Value: ; Type: KEYWORD, Value: float Type: IDENTIFIER, Value: b Type: KEYWORD, Value: = Type: CONSTANT, Value: 3.14 Type: KEYWORD, Value: ; Type: KEYWORD, Value: char Type: IDENTIFIER, Value: c Type: KEYWORD, Value: = Type: CONSTANT, Value: A Type: KEYWORD, Value: ; Type: KEYWORD, Value: if Type: IDENTIFIER, Value: ( Type: IDENTIFIER, Value: a Type: KEYWORD, Value: > Type: IDENTIFIER, Value: b Type: KEYWORD, Value: ) Type: KEYWORD, Value: { Type: KEYWORD, Value: return Type: IDENTIFIER, Value: aType: KEYWORD, Value: ;Type: KEYWORD, Value: }Type: KEYWORD, Value: elseType: KEYWORD, Value: {Type: KEYWORD, Value: returnType: IDENTIFIER, Value: bType: KEYWORD, Value: ;Type: KEYWORD, Value: }```七、实验总结通过本次实验,我们成功地设计并实现了一个简单的词法分析器,能够识别并输出源代码中的单词。

词法分析实验报告

词法分析实验报告

词法分析实验报告一、实验目的和背景词法分析是编译原理中的重要部分之一,其主要作用是将源程序中的字符序列转化为有意义的单词序列,以便于后续的处理和分析。

为了更好地理解词法分析的实现原理以及掌握相关算法和工具,本次词法分析实验旨在通过手动编写正则表达式、确定有限自动机的状态转移函数和实现词法分析程序来实现词法分析。

二、实验内容在本次实验中,我们需要完成以下任务: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. 继续进行状态转移,直至读取完整个源程序。

四、实验结果通过以上步骤,我们成功完成了对给定源程序的词法分析。

词法分析实验报告

词法分析实验报告

词法分析实验报告词法分析是编译原理中的一个重要概念,它是编译器中的第一个阶段,也是最基础的一个阶段。

词法分析器将输入的源代码转化为一系列的标记(Token),这些标记是语法分析器后续分析的基本单元。

在本次实验中,我们使用C语言编写了一个简单的词法分析器。

该词法分析器可以识别常见的C语言关键字(如if、while、for等)、运算符(如+、-、*、/等)、标识符、常量等,并将它们转化为相应的标记。

实验过程中,我们使用了C++编程语言来实现词法分析器。

在主函数中,我们首先读取输入的源代码文件,并将其逐个字符地进行扫描。

扫描过程中,我们利用一些常见的正则表达式来匹配每个标记,并将其转化为相应的Token。

在匹配完成后,我们将Token存储在一个Token序列中,以便后续的语法分析器使用。

实验过程中,我们遇到了一些困难。

一是字符匹配的问题,在处理运算符等特殊字符时,需要对转义字符进行特殊处理。

二是标识符的识别问题,我们需要判断一个字符是否属于标识符中的某一部分,而不能将其单独当作一个标记。

为了解决这个问题,我们采用了状态机的方法,维护一个标识符的状态,根据状态的变化来判断是否识别到了一个完整的标识符。

在实验结果中,我们成功地将源代码转化为了一系列的标记。

这些标记可以用于后序的语法分析和语义分析等过程中。

同时,我们也发现了一些问题,如在处理注释时可能会出现误判等。

针对这些问题,我们可以进一步改进词法分析器,提高其准确性和鲁棒性。

总的来说,通过本次实验,我们深入理解了词法分析的原理和过程,并成功地实现了一个简单的词法分析器。

通过这个实验,我们对编译原理有了更深入的了解,并提高了自己的编程能力。

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

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

编译原理词法分析实验报告软工082班兰洁200831104044一、实验内容二、实验目的三、实验预期四、程序规定五、实验原理●程序流程图●判别浮点功能扩展流程图●状态转换图六、程序代码与浮点判别功能扩展七、测试用例●扩展功能测试用例;●普通功能测试用例八、输出结果九、实验心得一、实验内容:词法分析:1、识别简单语言的单词符号;2、识别关键字、标识符、数字、运算符等。

并扩展浮点识别功能。

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

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

四、程序规定:1、关键字:"function","if","then","while","do","endfunc";2、算术运算符:”+”,”-”,”*”,”/”,”=”;3、关系运算符:"<" ">" "<=" ">=" "==" "!=";4、界符:"(" ")" ";" "#";5、标识符规定以字母开头,字母均为小写;6、空格和换行符跳过;7、单词对应编码:十、实验原理:输入串--------------------〉词法分析程序————————〉单词符号串输入:字符串以#结束。

输出:单词的二元组(syn,token/sum)程序流程图分析浮点数功能扩展部分流程图:shuzi()函数状态转换图六、程序代码:备注:红色字体部分为程序功能的功能扩展,使程序能够分析浮点数!我把浮点数的syn设置为80!/*词法分析源代码*/#include<stdio.h>#include<string.h>scaner();char prog[80],token[8];char ch;int syn,p,m,n,sum;char * rwtab[6]={"function","if","then","while","do","endfunc"}; int i=0,k,c,sumint,f;char fenshu[80],sum1[80];double sumf=0,fudian;int shuzi(){if(ch>='0' && ch<='9')syn=80;elsesyn=-2;return syn;}main(){p=0;printf("\n please input string :\n");do{scanf("%c",&ch);prog[++p]=ch;}while(ch!='#');p=0;do{scaner();switch(syn){ case 11:printf("\n(%d,%d)",syn,sum);break;case -1:printf("\n error");break;case 80:printf("\n(%d,%f)",syn,fudian);break; default:printf("\n(%d,%s)",syn,token);}}while(syn!=0);}scaner(){for(n=0;n<8;n++)token[n]=NULL;//if(1+2!=3)ch=prog[++p];while(ch==' ' || ch=='\n')ch=prog[++p];//跳过空格if(ch>='a' && ch<='z'){m=0;while(ch>='a' && ch<='z' || ch>='0' && ch<='9') {token[m++]=ch;//token[0]=f,m=1ch=prog[++p];}token[m]='\0';ch=prog[--p];syn=10;for(n=0;n<6;n++){if(strcmp(token,rwtab[n])==0){syn=n+1;break;}}}elseif(ch>='0' && ch<='9'){c=p;k=0;do{ sum1[k]=ch;ch=prog[++c]; //ch取后一个数字k++;shuzi();//这个函数用来分析浮点数的整数部分是否已经输入到数组里f=syn;} while(f==80)if(ch=='.'){for(n=0;n<k;n++){sumint=sumint*10+sum1[n]-'0';} //计算整数部分i=0;do{ch=prog[++c];fenshu[i]=ch;i++;shuzi();//这个函数用来分析浮点数的小数部分是否已经输入到数组里} while(syn==80);sumf=0;for(k=i-2;k>=0;k--){sumf=sumf*0.1+(fenshu[k]-'0')*0.1;} //计算浮点数的小数部分fudian=sumint+sumf; //浮点数计算syn=80;p=--c;}else{ch=prog[p];//若是整数,ch等于原来的值 sum=0;while(ch>='0' && ch<='9'){sum=sum*10+ch-'0';ch=prog[++p];}ch=prog[--p];syn=11;}}elseswitch(ch){case'<':m=0;token[m++]=ch;ch=prog[++p];if(ch=='='){syn=22;token[m++]=ch;}elseif(ch=='>'){syn=21;token[m++]=ch;}else{syn=20;ch=prog[--p];}break;case'>':m=0;token[m++]=ch;ch=prog[++p];if(ch=='='){syn=24;token[m++]=ch;}else{syn=23;ch=prog[--p];}break;case'=':m=0;token[m++]=ch;ch=prog[++p];if(ch=='='){syn=25;token[m++]=ch;}else{syn=18;ch=prog[--p];}break;case'!':m=0;token[m++]=ch;ch=prog[++p];if(ch=='='){syn=22;token[m++]=ch;}else{syn=-1;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=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;default:syn=-1;}}七、测试用例:补充:功能扩展测试用例:八、程序输出结果:功能扩展测试用例输出结果用例一:用例二:用例三:普通功能测试用例显示结果九、实验心得通过编译原理实验一词法分析实验,使得自己对词法分析的流程有了更深刻的了解,虽然源代码并非由自己设计,但是在调试程序的过程中,尤其是进行测序功能扩展的过程中,想了很多种办法,终于找到了最合适的方法,而且还进行了代码的优化,这个过程虽然有时有些枯燥,但是更多时候是欣喜的,不仅复习了c语言的许多内容,并且有了更深的理解。

词法分析程序实验报告

词法分析程序实验报告

词法分析程序实验报告一、实验目的1. 理解词法分析器的基本功能2. 理解词法规则的描述方法3. 理解状态转换图及其实现4. 能够编写简单的词法分析器二、实验要求2、主程序流程图三、识别单词的状态转换图Scanner()函数流程图2. 分析直接转向法和表驱动法的优缺点状态转换图的实现通常有两种方法:状态转换表和直接转向法(1) :状态转换表法又称数据中心,是把状态转换图看作一种数据结构,由控制程序控制字符在其上运行,从而完成词法分析。

优点是程序短,但是占存储空间多,(2)直接转向法又称程序中心法,是把状态转换图看成一个流程图,从状态转换图的初态开始,对它的每一个状态节点都编写一段相应的程序。

源程序如下#include<stdio.h>#include<string.h>char ch;//扫描哪一个字符char stoken[100];//扫描到的单词序列char token[10];//存储已扫描到的单词int p,m,n;int state;//词法分析时进入哪一个状态int row;//用于标注哪一行不能识别long int num;char*key[8]={"function","if","else","for","then","while","do","endfunction"};//定义好的能识别的关键字void scanner(){for(n=0;n<10;n++) //变量初始化token[n]=NULL;m=0;ch=stoken[p];p++;while(ch == ' '||ch == '\n')//跳过空格或是换行符{ch=stoken[p];p++;}if(ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z'){m = 0;while(ch >= 'a' && ch <= 'z' || ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z'){token[m++] = ch;ch = stoken[p++];//扫描下一个}ch = stoken[--p];state = 10;for(n = 0; n < 8; n++)if(strcmp(token, key[n])== 0){state = n + 1;break;}}elseif(ch >= '0' && ch <= '9')//是数字{num = 0;while(ch >= '0' && ch <= '9')//可能是多位数字{num = num * 10 + ch - '0';ch =stoken[p++];}ch = stoken[--p];state = 11;}elseswitch(ch){case '<':m = 0;token[m++] = ch;ch = stoken[p++];if(ch == '='){state = 21;token[m++] = ch;}else{state = 20;ch = stoken[--p];}break;case '>':m = 0;token[m++] = ch;ch = stoken[p++];if(ch == '='){state = 24;token[m++] = ch;}else{state = 23;ch = stoken[--p];}break;case'=':m=0;token[m++]=ch;ch = stoken[p++];if(ch=='='){state = 25;token[m++]=ch;}else{state=18;ch = stoken[--p];}break;case'!':m=0;token[m++]=ch;ch = stoken[p++];if(ch == '='){state=22;token[m++]=ch;}else{state = -1;}break;case'+':state=13;token[0]=ch;break;case'-':state=14;token[0]=ch;break;case'*':state=15;token[0]=ch;break;case'/':state=16;token[0]=ch;break;case';':state=26;token[0]=ch;break;case'(':state=27;token[0]=ch;break;case')':state=28;token[0]=ch;break;case'{':state=29;token[0]=ch;break;case'}':state=30;token[0]=ch;break;case '#':state = 0;token[0] = ch;break;default:state=-1;break;}}main(){p=0;row=1;printf("请输入要分析的单词:\n");while(ch!='#'){scanf("%c",&ch);stoken[p++]=ch;}printf("词法分析如下:\n");p=0;do{scanner();switch(state){case 11:printf("\n(%d, %d)",num,state);break;case -1:printf("\n不能识别 %d",row);break;default:printf("\n(%s, %d)",token,state);break;}}while(state!=0);}。

【实验报告】实验一 编写词法分析程序

【实验报告】实验一 编写词法分析程序

编译原理实验报告实验名称:编写词法分析程序_______实验类型:设计型实验指导教师:专业班级:姓名:学号:实验地点:实验成绩:日期:2017年4月15日实验一编写语法分析程序一、实验目的1)通过设计、调试词法分析程序,掌握词法分析程序的设计工具,即有穷自动机,进一步理解自动机理论;2)掌握正则文法和正则表达式转换成有穷自动机的方法及有穷自动机的实现方法;3)会确定词法分析程序的输出形式及标识符与关键字的区分方法;4)加深对课堂教学的理解,提高词法分析方法的实践能力,掌握使用实验环境的技能技巧以及程序的调试方法。

二、实验设计1、写出TEST语言每条词法规则对应的正则文法或者正则表达式1)标识符:字母打头,后接任意字母或数字。

正则表达式:( a|b|……|z|A|B……|Z )( 0|1|……|9| a|b|……|z|A|B……|Z )*2)保留字:标符的子集,包括:if, else, for, while, do, int, write, read。

正则表达式:if | else | for | while | do | int | write | read3)无符号整数:由数字组成,但最高位不能为0,允许一位的0。

正则表达式:( (1……|9 )( 0|1|……|9)* )|04)分界符:(、)、;、{、}正则表达式:( | ) | ; | { | }5)运算符:+、-、*、/、=、<、>、>=、<=、!=、==正则表达式:+ | - | * | / | = | < | > | >= | <= | != | ==6)注释符:/* */正则表达式:/*(没有连续的*/的任意字符串|ℇ)*/2、对每个文法或者正则表达式分别构造NFA1)标识符:( a|b|……|z|A|B……|Z )( 0|1|……|9| a|b|……|z|A|B……|Z )*2)无符号整数:( (1|2|……|9 )( 0|1|……|9)* )|03)分界符:( | ) | ; | { | }4)运算符:+ | - | * | / | = | < | > | >= | <= | != | ==5)注释符:/*(没有连续的*/的任意字符串|ℇ)*/非*非*|非/3、将NFA合并,确定化,化简得到最终的DFA。

词法分析程序报告及用例

词法分析程序报告及用例

题目:词法分析器设计实验类别:设计性实验实验目的:(1)掌握词法分析器的构造过程以及基本方法。

(2)理解正规式、NFA、DFA及最小化DFA的转换过程和方法。

实验内容:给定一个正规式R=XY*|YX*Y|XYX,请先在练习本上将此正规式转变为NFA、DFA、最小化DFA;对你所完成的最小化DFA进行编程,完成词法分析器工作。

实验原理:对于正规式R=XY*|YX*Y|XYX最小化DFA如下图:设计分析:1.对于给定的正规式的每一个产生式进行编码,可以将正规式分成三个部分进行编码,R=XY*,R=YX*Y和R=XYX。

2.对于产生式R=XY*,通过统计输入式子字符的个数与字符中Y的个数进行比较,可以判断出输入式是否为正规式R的产生式。

3.对于产生式R=YX*Y,首先通过判断输入式的第一个字符和最后一个字符是否为Y,是Y就再通过统计输入式子字符的个数与字符中Y的个数进行比较,可以判断出输入式是否为正规式R的产生式。

4.还要考虑到输入有空格的情况,当输入有空格的时候,从空格后面开始重新算作一个式子。

5.其他情况输出不属于正规式R。

程序代码:头文件:search.h包含函数search1(),search2()用于查找输入字符串中X或Y的个数,而函数text()用于检测输入字符串是否属于正规式。

#include <iostream.h>int m;char s[128],h[128]; //字符数组s是判断输入串中有无空格后的字符串,字符数组h是开始输入的字符串int count,count2;int search1(char p[],int a){count=0;for(int d=a;d<m;d++){if(p[d]=='Y')count++;}return count;}int search2(char o[],int b){count2=0;for(int f=b;f<m;f++){if(o[f]=='X')count2++;}return count2;}void text(char k[]){if(k[0]=='X') //第一层头字符为X的{if(m>1){if(k[1]=='Y'){if(k[2]=='Y'){search1(k,3); //查找字符中Y的个数if(count==m-3)cout<<k<<"属于正规式R = XY* !"<<endl; //符合正规式XY*的字符串elsecout<<k<<"不属于正规式R !"<<endl;}else if(k[2]=='X'){ if(m>3)cout<<k<<"不属于正规式R !"<<endl;elsecout<<k<<"属于正规式R = XYX !"<<endl; //符合正规式XYX的字符串}elsecout<<k<<"不属于正规式R !"<<endl;}elsecout<<k<<"不属于正规式R !"<<endl;}else if(m=1) //符合正规式X的字符串cout<<k<<"属于正规式R = X !"<<endl;}else if(k[0]=='Y') //第二层头字符为Y的{ if(k[1]=='X'){ if(k[m-1]=='Y'){ search2(k,2); //查找字符中X的个数if(count2==m-3)cout<<k<<"属于正规式R = YX*Y !"<<endl; //符合正规式YX*Y的字符串elsecout<<k<<"不属于正规式R !"<<endl;}elsecout<<k<<"不属于正规式R !"<<endl;}else if(k[1]=='Y'){ if(m>2)cout<<k<<"不属于正规式R !"<<endl;elsecout<<k<<"属于正规式R = YY !"<<endl; //符合正规式YY的字符串}}elsecout<<k<<"不属于正规式R !"<<endl; //第三层头字符随意的}主函数:#include <iostream.h>#include <string.h>#include "search.h"void main(){int n,x;x=0;cout<<"输入字符串:"<<endl;cin.get(h,128);n=strlen(h);for(int z=0;z<n;){if(h[z]!=32) //判断输入字符串是否含有空格{s[x]=h[z];m++;x++;z++;}else{while(h[z]==32){h[z]=h[++z];}text(s);*s=NULL;x=0;m=0;}}text(s);*s=NULL;}测试用例:<1>不含空格的时候:1.当输入X时2.当输入XYYY时3.当输入YY时4.当输入YXXXY时5.当输入XYX时6.当输入其它形式X*Y*时7.当输入含有不是X或Y字符时<2>含空格时:实验总结:实际编程的过程中遇到许多问题,比如在考虑输入字符串是否属于产生式的时候,由于产生式是不定式,有很多延伸式,所以我通过统计输入字符中X或Y 的个数与产生式中X或Y的个数进行比较,相等的话说明用例属于产生式。

实现词法分析实验报告

实现词法分析实验报告

实现词法分析实验报告一、实验目的本次实验的目的是通过编写代码实现一个简单的词法分析器,可以对一段输入的代码进行词法分析,识别出其中的各种标识符、关键字、常数和运算符等。

二、实验原理词法分析是编译过程中的第一个阶段,它负责将源代码按照规定的规则划分为一个个的单词(Token),每个单词代表一个最基本的语法单元。

在词法分析中,我们通过预先定义好的正则表达式规则来描述各个单词类型,并自动从源代码中提取出这些单词。

本次实验采用基于正则表达式的文法描述方式,针对不同的单词类型,使用不同的正则表达式来匹配。

通过遍历源代码字符串,逐一尝试匹配各个正则表达式,从而实现对单词的划分。

在匹配过程中,我们使用一个状态机来记录当前的匹配状态,以便处理不同的情况。

三、实验过程1. 定义Token的数据结构,包括单词类型和单词值两个字段。

使用枚举类型来表示所有的单词类型,如关键字、标识符、常数等。

2. 编写正则表达式的匹配函数,用于判断给定的字符串是否符合某个模式。

在这个函数中,使用系统提供的正则表达式库或者手动实现正则表达式匹配算法。

3. 设计一个状态机,用于记录当前匹配的状态。

状态机的状态包括开始、正在匹配、匹配成功和匹配失败等。

在状态机中,根据当前字符和当前状态进行不同的处理。

4. 在状态机中,当一个完整的Token被匹配出时,根据其类型和值创建一个Token对象,并将其添加到Token列表中。

5. 将源代码字符串按照换行符划分成多行,逐行进行处理。

对于每一行,调用状态机进行匹配,将得到的Token添加到Token列表中。

6. 输出Token列表,观察结果。

四、实验结果经过实验,我们成功实现了一个简单的词法分析器。

通过对输入的代码进行词法分析,我们可以得到每个单词的类型和值。

在本次实验中,我们测试了一段C语言代码,并成功提取出其中的关键字、标识符、常数和运算符等。

五、实验总结本次实验让我初步了解了词法分析的原理和过程。

词法分析器实验报告

词法分析器实验报告

词法分析器实验报告词法分析器是编译器的一个重要组成部分,用于将输入的字符流转换成一个个词法单元(token)。

本次实验使用Python语言实现了一个简单的词法分析器。

主要包括以下几个步骤:1. 预处理:去除源代码中的空格、换行符等无意义字符,并进行必要的错误检查。

2. 正则表达式定义词法单元:利用正则表达式定义源代码可以被识别为词法单元的模式。

例如,整数可以定义为由数字组成的串,标识符可以定义为以字母或下划线开头,后面跟着任意个字母、数字或下划线的串。

3. 正则表达式匹配:利用Python的re模块,使用定义好的正则表达式对预处理后的源代码进行匹配。

如果匹配成功,则生成对应的词法单元,并存储起来。

4. 输出词法单元:将生成的词法单元按照一定的格式输出。

实验结果:通过对不同的源代码进行测试,可以得到正确的词法单元输出。

例如,对于以下的源代码:```pythonx = 123 + 456 * (789 - 100)```经过词法分析器处理后,可以得到以下的词法单元输出:```Token(ID, 'x')Token(ASSIGN, '=')Token(INT, '123')Token(PLUS, '+')Token(INT, '456')Token(LPAREN, '(')Token(INT, '789')Token(MINUS, '-')Token(INT, '100')Token(RPAREN, ')')```总结与收获:通过本次实验,我对词法分析器的基本原理和实现方法有了更深入的了解。

同时,我学会了如何使用正则表达式进行模式匹配,以及如何使用Python的re模块进行正则表达式匹配。

这对于我进一步学习和理解编译原理以及编译器的工作原理有很大帮助。

实验项目一:词法分析程序实验

实验项目一:词法分析程序实验

实验项目1:词法分析程序实验
实验要求和指导
一、实验的目的与任务:
输入:源程序
输出:单词
二、估计实验时间8学时
1.课余准备;
2.上机一次到二次,第一次编好程序,第二次修改完善,并尽量扩充程序的功能;
3.完成实验报告2小时。

三、实验过程和指导
(一)准备:确定并熟悉开发工具,如C、VC、VC++、Delhi等;充分了解被处理的语言的语法特点(语言定义见下面)。

写好实验报告,编好程序。

(二)上机:安装所需的开发工具,输入或拷贝程序,调试。

四、实验报告要求
1.程序源代码以及可执行文件;
2.已经测试通过的测试数据3组;
3.实验报告按照规定要求书写:
(1)实验步骤
(2)程序结构描述:函数调用格式、参数含义、返回值描述、函数功能;
4.实验总结(提交)。

五、上交文档
1.实验报告
2.程序文件
1。

2021年编译原理实验报告词法分析程序

2021年编译原理实验报告词法分析程序

编译原理试验汇报(一)----词法分析程序【目要求】经过设计编制调试一个具体词法分析程序, 加深对词法分析原理了解。

并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词词法分析方法。

【题目分析】本试验以用户指定想编译以C语言编写文件作为词法分析程序输入数据。

在进行词法分析中, 先自文件头开始以行为单位扫描程序, 将该行字符读入预先设定一个数组缓冲区中, 然后对该数组字符逐词分割, 进行词法分析, 将每个词分割成关键字、标识符、常量和运算符四种词种, 最终产生四个相对应表, 即关键字表、标识符表、常量表和运算符表, 它们以文件形式进行存放。

除此之外, 还产生一个编译后文件, 它指定了每个词在四个表中位置。

【试验过程】下面就词法分析程序汉字件和关键变量进行说明:文件:cpile.c 主程序文件key.txt 关键字文件operation.txt 运算符文件id.txt 标识符文件const.txt 常量文件after_com.txt 编译后产生文件关键变量:FILE *sfp,*nfp,*ifp,*kfp,*cfp,*pfp;char ib[50][20] 标识符表(动态生成)char cb[50][10] 常量表(动态生成)char kb[44][10] 关键字表(预先定义好)char pb[36][5] 运算符表(预先定义好)关键子函数名:int number(char s[],int i); 数字处理函数int letter(char s[],int i); 字符处理函数int operation(char s[],int i); 运算符处理函数void seti (char s[]); 标识符建立函数void setc (char s[]); 常量建立函数void cfile(char s1[], char s2[],int m); 将词和词所在表中位置写入编译后文件 void error1(char s[]); 字符处理犯错汇报void error2(char s[]); 标识符处理犯错汇报void error3(char s[]); 运算符处理犯错汇报void openall(); 打开全部文件void writeall(); 将四个表写入文件void closeall(); 关闭全部文件下面简明分析一下词法分析程序运行步骤:【程序调试】现有源程序a.c清单以下:#include <stdio.h>int main(int argc, char *argv[]) {char ch;int i;ch='a';ch=ch+32 ;i=ch;printf("%d id %c\n",i,ch);/*打印*/ return 0;}运行词法分析程序后, 显示以下结果: after_com.txt文件:#[p--2]include[i--0]<[p--14]stdio.h[i--1]>[p--16]int[k--2]main[i--2]([p--7]int[k--2]argc[i--3],[p--6]char[k--0]*[p--9]argv[i--4]][p--21])[p--8]{[p--23]char[k--0]ch[i--5];[p--13]int[k--2]i[i--6];[p--13]ch[i--5]=[p--15]'[p--19]a[i--7]'[p--19];[p--13]ch[i--5]=[p--15]ch[i--5]+[p--10]32[c--0];[p--13]i[i--6]=[p--15]ch[i--5];[p--13]printf[k--33] ([p--7]"[p--1]d[i--8]id[i--9]%[p--4]c[i--10]\[p--20]n[i--11]"[p--1],[p--6]i[i--6],[p--6]ch[i--5])[p--8];[p--13]return[k--28]0[c--1];[p--13]}[p--25]key.txt 关键字文件:0 char1 short2 int3 unsigned4 long5 float6 double7 struct8 union9 void10 enum11 signed12 const13 volatile14 typedef15 auto16 register17 static18 extem19 break20 case21 continue22 default23 do24 else25 for26 goto27 if28 return29 switch30 while31 sizeof32 txt33 printf34 FILE35 fopen36 NULL37 fclose38 exit39 r40 read41 close42 w43fprintfid.txt 标识符文件:0 include1 stdio.h2 main3 argc4 argv5 ch6 i7 a8 d9 id10 c11 noperation.txt 运算符文件:0 !1 "2 #3 $4 %5 &6 ,7 (8 )9 *10 +11 -12 :13 ;14 <15 =16 >17 ?18 [19 '20 \21 ]22 .23 {24 ||25 }26 !=27 >=28 <=29 ==30 ++31 --32 &&33 /*34*/const.txt 常量文件:0 3210结果完全正确。

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

词法分析程序实验报告篇一:词法分析器_实验报告词法分析器实验报告实验目的:设计、编制、调试一个词法分析子程序-识别单词,加深对词法分析原理的理解。

实验要求:该程序要实现的是一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分界符五大类。

并依次输出各个单词的内部编码及单词符号自身值。

(一)实验内容(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语句的条件,解决了此问题。

(三)实验总结:此次实验总共用了两大节的课时间,小部分时间写代码,大部分时间调试,其他时间写报告,在写报告的工程中,对一些东西更加的了解,同时觉得自己的程序还有很多需要改进的地方,由于时间的关系没有进行改进,例如有时非法字符,没有进行输出,只是大致上完成了一符一种的输出结果。

此次实验让我了解了如何设计、编制并调试词法分析程序,并加深了我对词法分析器原理的理解;熟悉了直接构造词法分析器的方法和相关原理,并学会使用Java语言直接编写词法分析器;同时更熟练的掌握用Java语言编写程序,实现一定的实际功能。

主要源程序:/* * 读取文件 */public static void getChar() throws Exception{File f= new File("" +"d:/java/main.txt"); if(!f.exists()){ "文件不存在,请输入正确的文件路径"); } FileReader fr = new FileReader(f); int rs = 0; char []data = new char[256]; "");while((rs = fr.read(data)) > 0){string = new String(data,0,rs).trim(); } }/* * 判断读入的字符是否为字母 */ public static boolean isLetter(char c){if((ch >= 'a' && ch + 'A' && ch ='0' && ch 篇二:词法分析实验报告词法分析器一、实验目的:通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。

并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。

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

并依次输出各个单词的内部编码及单词符号自身值。

二、实验要求如源程序为C语言。

输入如下一段:main() { int a,b; a = 10; b = a + 20;}# 要求输出如右图。

要求: 1、将单词分为五种识别关键字:main、if、int、for、while、do、return、break、continue;单词种别码为1。

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

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

运算符包括:+、-、*、/、=、>、=、分隔符包括:,、;、{、}、(、);单词种别码为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 b +=20;c=%@;return 0;}#结果五、实验过程记录1、因为用到回退函数fseek(),而以前没有用过这个函数,所以开始时很苦恼,不知道如何回退一个字符,后来问了同学,才明白原来有这么一个函数,顿时豁然开朗。

2、本次试验中word[20]保存字符串时,不能正确保存,总是出错,原因是while(IsNum(ch)||IsAlpha(ch)){ Word[i]=ch;i++;ch=fgetc(fp);}中,i++与Word[i]=ch;次序不对,后来多次思索,发现问题。

六、实验总结本次实验花了将近一个下午才完成。

在纸上设计的时间大约40分钟,剩下的时间是录入和调试。

本次实验使我认识到,一段时间搁置,不编程序,水平会下降,好多有关c 语言的知识会忘掉,所以以后我会经常写写程序。

另外,通过本次实验,我又进一步加深对词法分析原理的理解。

总的来说,获益匪浅!附录#include#include#include#include#includeChar*Key[9]={"void","main","int","if","then","else" ,"return","break","continue"};char ch; // 存储识别出的单词流int IsAlpha(char c) { //判断是否为字母if(((c='a'))||((c='A'))) return 1;else return 0;}int IsNum(char c){ //判断是否为数字if(c>='0'&&c else return 0;}int IsKey(char *Word){ //识别关键字函数int m,i;for(i=0;i if((m=strcmp(Word,Key[i]))==0)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);i=1;while(IsNum(ch)||IsAlpha(ch)){//判断该字符是否是字母或数字 Word[i]=ch;i++;ch=fgetc(fp);}Word[i]='\0'; //'\0' 代表字符结束(空格)fseek(fp,-1,1);//回退一个字符c=IsKey(Word);//判断是否是关键字if(c==0) cout else cout }else //开始判断的字符不是字母篇三:编译原理实验报告(词法分析器语法分析器) 编译原理实验报告实验一一、实验名称:词法分析器的设计二、实验目的: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 int digit(char s){if((s>=48)&&(s 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]);}while(a[i]!='#'); i=1; j=0; get();while(s!='#'){ memset(token,0,20);switch(s) {case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': wh(原文来自:小草范文网:词法分析程序实验报告)ile(letter(s)||digit(s)) {token[j]=s; j=j+1; get(); }retract();k=lookup(token); if(k==0)printf("(%d,%s)",6,token); else printf("(%d,-)",k); break;。

相关文档
最新文档