编译原理实验五

合集下载

编译原理实验报告

编译原理实验报告

编译原理实验报告一、实验目的本次编译原理实验的主要目的是通过实践加深对编译原理中词法分析、语法分析、语义分析和代码生成等关键环节的理解,并提高实际动手能力和问题解决能力。

二、实验环境本次实验使用的编程语言为 C/C++,开发工具为 Visual Studio 2019,操作系统为 Windows 10。

三、实验内容(一)词法分析器的设计与实现词法分析是编译过程的第一个阶段,其任务是从输入的源程序中识别出一个个具有独立意义的单词符号。

在本次实验中,我们使用有限自动机的理论来设计词法分析器。

首先,我们定义了单词的种类,包括关键字、标识符、常量、运算符和分隔符等。

然后,根据这些定义,构建了相应的状态转换图,并将其转换为程序代码。

在实现过程中,我们使用了字符扫描和状态转移的方法,逐步读取输入的字符,判断其所属的单词类型,并将其输出。

(二)语法分析器的设计与实现语法分析是编译过程的核心环节之一,其任务是在词法分析的基础上,根据给定的语法规则,判断输入的单词序列是否构成一个合法的句子。

在本次实验中,我们采用了自顶向下的递归下降分析法来实现语法分析器。

首先,我们根据给定的语法规则,编写了相应的递归函数。

每个函数对应一种语法结构,通过对输入单词的判断和递归调用,来确定语法的正确性。

在实现过程中,我们遇到了一些语法歧义的问题,通过仔细分析语法规则和调整函数的实现逻辑,最终解决了这些问题。

(三)语义分析与中间代码生成语义分析的任务是对语法分析所产生的语法树进行语义检查,并生成中间代码。

在本次实验中,我们使用了四元式作为中间代码的表示形式。

在语义分析过程中,我们检查了变量的定义和使用是否合法,类型是否匹配等问题。

同时,根据语法树的结构,生成相应的四元式中间代码。

(四)代码优化代码优化的目的是提高生成代码的质量和效率。

在本次实验中,我们实现了一些基本的代码优化算法,如常量折叠、公共子表达式消除等。

通过对中间代码进行分析和转换,减少了代码的冗余和计算量,提高了代码的执行效率。

电子科大-编译原理实验报告(得分80分)

电子科大-编译原理实验报告(得分80分)

电子科技大学实验报告学生姓名:爸爸学号:2222222222222 指导教师:陈昆实验地点:科研楼A-506 实验时间:2017-04-28一、实验项目名称:词法分析器的设计与实现二、实验学时:4学时三、实验原理1.编译程序要求对高级语言编写的源程序进行分析和合成,生成目标程序。

词法分析是对源程序进行的首次分析,实现词法分析的程序为词法分析程序或词法分析器,也称扫描器。

2.词法分析的功能是:从左到右逐个地扫描源程序字符串,按照词法规则,识别出单词符号作为输出,对识别过程中发现的词法错误,输出相关的错误信息。

3.识别出来的单词会采用某种中间表现形式,通常一个单词用一个二元式来表示:(单词类别,单词的属性)。

4.状态转换图简称转化图,是有限有向图,是设计词法分析器的有效工具。

四、实验目的通过该实验,让同学们自己独立自主的设计词法分析器,使得同学们可以更好的掌握词法分析程序设计的原理及相应的程序设计方法,对编译这门课程也可以有更加深刻理解,同时还可以锻炼编程能力。

五、实验内容实现求n!的极小语言的词法分析程序,返回二元式作为输出。

六、实验器材(设备、元器件)1.操作系统:Windows XP2.开发工具:VS2013七、实验步骤(1)在VS2013中创建工程;(2)编写输入输出,初始化,错误处理等函数;(3)建立相应的单词符号与种别对照表,根据状态转换图编写相应的处理函数;(4)运行代码进行调试;(5)编写测试需要的输入文件:.pas文件;(6)生成.dyd文件。

八、实验数据及结果分析编码完成后将测试程序放入debug文件夹中,测试程序如下图:代码运行成功后在debug文件夹中会产生对应的exe,在cmd中运行后,会在debug文件夹中生成后缀为dyd和err的文件,打开dyd如下图所示:因为没有错误,所以对应的test1.err的文件为空可以对源程序进行词法分析,如果有错给出出错信息和所在行数,如果无错则生成二元式文件。

编译原理实验报告

编译原理实验报告

编译原理实验报告编译原理实验报告一、实验目的1. 了解编译器的基本原理和工作过程;2. 掌握编译器设计和实现的基本方法和技巧;3. 通过设计和实现一个简单的编译器,加深对编程语言和计算机系统的理解和认识。

二、实验原理编译器是将高级语言程序翻译成机器语言程序的一种软件工具。

它由编译程序、汇编程序、链接程序等几个阶段组成。

本次实验主要涉及到的是编译程序的设计和实现。

编译程序的基本原理是将高级语言程序转换为中间代码,再将中间代码转换为目标代码。

整个过程可以分为词法分析、语法分析、语义分析、代码生成和代码优化几个阶段。

三、实验内容本次实验的设计目标是实现一个简单的四则运算表达式的编译器。

1. 词法分析根据规定的语法规则,编写正则表达式将输入的字符串进行词法分析,将输入的四则运算表达式划分成若干个单词(Token),例如:运算符、操作数等。

2. 语法分析根据定义的语法规则,编写语法分析程序,将词法分析得到的Token序列还原成语法结构,构建抽象语法树(AST)。

3. 语义分析对AST进行遍历,进行语义分析,判断表达式是否符合语法规则,检查语义错误并给出相应的提示。

4. 代码生成根据AST生成目标代码,目标代码可以是汇编代码或者机器码。

四、实验过程和结果1. 首先,根据输入的表达式,进行词法分析。

根据所定义的正则表达式,将输入的字符串划分成Token序列。

例如:输入表达式“2+3”,经过词法分析得到的Token序列为["2", "+", "3"]。

2. 然后,根据语法规则,进行语法分析。

根据输入的Token序列,构建抽象语法树。

3. 接着,对抽象语法树进行语义分析。

检查表达式是否符合语法规则,给出相应的提示。

4. 最后,根据抽象语法树生成目标代码。

根据目标代码的要求,生成汇编代码或者机器码。

五、实验总结通过本次实验,我对编译器的工作原理有了更深入的认识,掌握了编译器设计和实现的基本方法和技巧。

编译原理实验

编译原理实验

实验一:词法分析器一、实验目的通过编写词法分析程序,了解词法分析的过程。

二、实验内容编写能识别给定的程序设计语言的词法规则,输出单词流的识别程序。

三、实验设备及工具1.硬件:PC机Pentium100以上。

2.软件:Win2000或WinXP、BC++、VC++或JA VA开发环境。

四、实验说明以下所给文法是进行词法分析和语法分析的依据,并将该文法中涉及到的单词信息提取到了单词符号与种别对照表中。

本次实验要求编写符合该文法构词规则的词法分析器。

1. 文法G(<程序>)<程序>→BEGIN <语句表> END.<语句表>→<语句>|<语句>;<语句表><语句>→<赋值语句>︱<条件语句>︱<WHILE语句>︱<复合语句><赋值语句>→<变量>=<算术表达式><条件语句>→IF <关系表达式> THEN <语句> ELSE <语句><WHILE语句>→WHILE <关系表达式> DO <语句><复合语句>→BEGIN <语句表> END<算术表达式>→<项>|<算术表达式>+<项>|<算术表达式>-<项><项>→<变量>|<整数><关系表达式>→<算术表达式><关系运算符><算术表达式><关系运算符>→<︱= =︱><变量>→<标识符><标识符>→<标识符><字母>|<标识符><数字>|<字母><整数>→<数字>|<数字><整数><字母>→A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z<数字>→0|1|2|3|4|5|6|7|8|9注意阴影部分,其中<整数>和<标识符>被看作最小词法单位。

编译原理实验报告(手打)

编译原理实验报告(手打)

《编译原理》实验报告班级:计C104姓名:李云霄学号:108490实验一词法分析程序实现一、实验目的与要求通过编写和调试一个词法分析程序,掌握在对程序设计语言的源程序进行扫描的过程中,将字符形式的源程序流转化为一个由各类单词符号组成的流的词法分析方法。

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

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

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

三、实现方法与环境1、首先设计识别各类单词的状态转换图。

描述无符号常数的确定、最小化状态转换图如图1所示。

其中编号0,1,2,…,6代表非终结符号<无符号数>、<余留无符号数>、<十进小数>、<小数部分>、<指数部分>、<整指数>及<余留整指数>, 1,2和6为终态,分别代表整数、小数和科学计数的识别结束状态。

图1 文法G[<无符号数>]的状态转换图其中编号0,1,2,…,6代表非终结符号<无符号数>、<余留无符号数>、<十进小数>、<小数部分>、<指数部分>、<整指数>及<余留整指数>, 1,2和6为终态,分别代表整数、小数和科学计数的识别结束状态。

在一个程序设计语言中,一般都含有若干类单词符号,为此可首先为每类单词建立一张状态转换图,然后将这些状态转换图合并成一张统一的状态图,即得到了一个有限自动机,再进行必要的确定化和状态数最小化处理,最后据此构造词法分析程序。

四则运算算术符号的识别很简单,直接在状态图的0状态分别引出相应标记的矢根据描述语言中各类单词的文法状态转换图或状态矩阵,利用某种语言(C语言或JAVA语言)直接编写词法分析程序。

《编译原理》实验报告

《编译原理》实验报告
i=0; zf=0; j=0; h=0; while(wfh[i]!='$') { ch1=wfh[i]; ch2=wfh[i+1]; if(ch1>='0' && ch1<='9') { if((ch2>='0'&& ch2<='9') || ch2=='.' || zf=1; else zf=0; } if(ch1=='.') { if(ch2>='0'&& ch2<='9'&& j<=1 ) zf=1;
ch2=='e'||ch2=='$' )
zf=1; elsh
zf=0; } if(ch1=='e'){ if(ch2>='0' && ch2<='9' && h<=1||ch2=='+'||ch2=='-')
zf=1; else zf=0; } if(ch1=='+' || ch1=='-'){
if(i==0) break; if(ch2>='0' && ch2<='9'||ch2=='$') zf=1; else zf=0; } if (zf==0) break; else i++; } if(zf==0) printf("Input number are error!\n"); else printf("Input number are right!\n"); }

编译原理实验大纲

编译原理实验大纲

编译原理实验大纲1.实验简介-介绍编译原理实验的目的和意义。

-解释编译原理实验的基本原理和流程。

2.实验环境搭建-说明实验所需的软件工具和开发环境。

-指导学生安装和设置实验环境。

3.实验一:词法分析器设计-介绍词法分析器的作用和原理。

-分析需求,设计词法分析器的数据结构和算法。

-实现基于所设计算法的词法分析器。

-编写测试用例,验证词法分析器的功能和正确性。

4.实验二:语法分析器设计-介绍语法分析器的作用和原理。

-分析需求,设计语法分析器的数据结构和算法。

-实现基于所设计算法的语法分析器。

-编写测试用例,验证语法分析器的功能和正确性。

5.实验三:语义分析器设计-介绍语义分析器的作用和原理。

-分析需求,设计语义分析器的数据结构和算法。

-实现基于所设计算法的语义分析器。

-编写测试用例,验证语义分析器的功能和正确性。

6.实验四:中间代码生成-介绍中间代码生成的作用和原理。

-分析需求,设计中间代码生成的数据结构和算法。

-实现基于所设计算法的中间代码生成器。

-编写测试用例,验证中间代码生成器的功能和正确性。

7.实验五:目标代码生成-介绍目标代码生成的作用和原理。

-分析需求,设计目标代码生成的数据结构和算法。

-实现基于所设计算法的目标代码生成器。

-编写测试用例,验证目标代码生成器的功能和正确性。

8.实验六:优化与调试-介绍编译优化和调试的基本概念。

-分析已实现的编译器的性能和问题。

-提出优化方案,并实现相应的优化功能。

-进行性能测试和调试,验证优化效果和解决问题。

9.实验七:实验报告撰写-分析实验过程和结果,总结经验和收获。

-撰写实验报告,包括实验目的、原理、实现过程、结果分析等内容。

-提交实验报告并进行评分评比。

10.总结与展望-对实验进行总结,回顾实验目标和实现情况。

-展望未来的发展方向和对编译原理的深入研究。

以上为编译原理实验的大纲,通过完成这些实验,学生可以深入理解编译原理的基本原理和算法,并掌握编译器的设计与实现方法。

《编译原理》实验教学大纲

《编译原理》实验教学大纲

《编译原理》实验教学大纲一、实验目的和任务编译原理是计算机科学与技术专业的一门重要课程,它主要研究的是将高级语言程序翻译成机器语言程序的方法和技术。

通过本实验课程的学习,旨在使学生掌握编译原理的基本原理和方法,培养学生对编译器结构与构造技术的专门知识和技能,为学生今后进行编译器设计与实现打下基础。

二、实验设备和工具1.计算机和相关硬件设备2. 编程语言的开发环境,如C/C++或Java三、实验内容1.实验一:词法分析器设计与实现a)实验目的:学习词法分析器的原理和设计方法,掌握正则表达式、DFA和NFA的转换方法。

b)实验任务:i.设计并实现一个词法分析器的原型,能够正确地识别出给定的程序中的词法单元。

ii. 使用给定的正则表达式设计并实现识别给定程序中的关键字、标识符、常量等的词法分析器。

2.实验二:语法分析器设计与实现a)实验目的:学习语法分析器的原理和设计方法,掌握上下文无关文法和LR分析表的构造方法。

b)实验任务:i.学习并理解上下文无关文法和LR分析表的构造方法。

ii. 设计并实现一个简单的递归下降语法分析器。

3.实验三:语义分析器设计与实现a)实验目的:学习语义分析器的原理和设计方法,掌握语义动作的定义和处理方法。

b)实验任务:i.学习并理解语义分析器的原理和设计方法。

ii. 设计并实现一个简单的语义分析器,能够对给定的程序进行语义分析和语义动作的处理。

4.实验四:中间代码生成器设计与实现a)实验目的:学习中间代码生成器的原理和设计方法,掌握中间代码的生成和优化方法。

b)实验任务:i.学习并理解中间代码生成器的原理和设计方法。

ii. 设计并实现一个简单的中间代码生成器,能够将给定的程序翻译成中间代码。

5.实验五:目标代码生成器设计与实现a)实验目的:学习目标代码生成器的原理和设计方法,掌握目标代码的生成和优化方法。

b)实验任务:i.学习并理解目标代码生成器的原理和设计方法。

ii. 设计并实现一个简单的目标代码生成器,能够将中间代码翻译成目标代码。

编译原理标准实验报告

编译原理标准实验报告

编译原理实验报告江苏科技大学电子信息学院2005年8月19日目录实验一:词法分析设计 (2)实验二:LL(1)预测分析 (10)实验三:逆波兰表达式的产生及计算 (26)实验四:SLR(1)语法分析设计 (48)实验五:应用DAG进行局部优化 (52)实验一词法分析设计一.实验目的通过本实验的编程实践,使学生了解词法分析的任务,掌握词法分析程序设计的原理和构造方法,使学生对编译的基本概念、原理和方法有完整的和清楚的理解,并能正确地、熟练地运用。

二.实验内容用VC++/VB/JAV A语言实现对C语言子集的源程序进行词法分析。

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

三.实验步骤1.基于实验的内容,构造程序所需的模块2.根据已建构的模块,写出各个模块的相应程序代码3.在主函数中调用模块来完成所要得到的效果四.参考答案1.源程序'#################################################################### #########################################'####'## 存在问题:如何能较好的判断符号的优先级??##'####'#################################################################### #########################################'******************************************************************** ********************************************' 定义变量'******************************************************************** ********************************************Dim str_stack(1 To 20) As String, str_input As String, str_output As String, current As StringDim stack_p As Double, str_feihouzhui As String'******************************************************************** ********************************************' 函数定义'******************************************************************** ********************************************Private Sub chansheng()Dim i As Double, j As Double, int_length As Long, stack_top As String,temp_stack_p As DoubleDim str_temp As String, int_length2 As Long, success As Boolean, str_temp_stack(1 To 20) As StringDim msg As Doublesuccess = TrueFor i = 1 To 20str_stack(i) = ""Nextstr_input = "": str_output = "": current = ""i = 1: j = 1: stack_p = 1temp_stack_p = 0 '用于存放优先级较高的运算符的临时堆栈的指针str_input = InputBox("请输入待转换的非后缀式:", "输入非后缀式", "(a+b*c)*d", 3000, 5000) & "#"str_feihouzhui = str_inputint_length = Len(str_input)int_length2 = int_lengthgrid.Rows = 100 '初始化表格控件grid.Cols = 4grid.TextMatrix(0, 0) = "当前符号"grid.TextMatrix(0, 1) = "输入区"grid.TextMatrix(0, 2) = "符号栈"grid.TextMatrix(0, 3) = "输出区"grid.ColWidth(0) = 2100 '设置列宽grid.ColWidth(1) = 2100grid.ColWidth(2) = 2075grid.ColWidth(3) = 3100Do While (success)current = Mid(str_input, 1, 1)l0: stack_top = str_stack(stack_p)str_temp = ""Select Case currentCase "0" To "9", "a" To "z"str_output = str_output & currentint_length2 = int_length2 - 1Case "*", "/"Select Case stack_topCase ""str_stack(stack_p) = currentint_length2 = int_length2 - 1Case "*", "/", "+", "-", "("stack_p = stack_p + 1str_stack(stack_p) = currentint_length2 = int_length2 - 1End SelectCase "+", "-"Select Case stack_topCase ""str_stack(stack_p) = currentFor j = temp_stack_p To 1 Step -1If str_temp_stack(temp_stack_p) <> "" Thenstack_p = stack_p + 1str_stack(stack_p) = str_temp_stack(j)temp_stack_p = temp_stack_p - 1End IfNextint_length2 = int_length2 - 1Case "*", "/"str_output = str_output & str_stack(stack_p) '若优先级低于栈顶运算符,则弹出栈顶运算符并输出If stack_p > 1 Thenstack_p = stack_p - 1Elsestr_stack(stack_p) = ""End IfGoTo l0Case "+", "-", "("stack_p = stack_p + 1str_stack(stack_p) = currentint_length2 = int_length2 - 1For j = temp_stack_p To 1 Step -1If str_temp_stack(temp_stack_p) <> "" Thenstack_p = stack_p + 1str_stack(stack_p) = str_temp_stack(j)temp_stack_p = temp_stack_p - 1End IfNextEnd SelectCase "("Select Case stack_topCase ""str_stack(stack_p) = currentint_length2 = int_length2 - 1Case "*", "/", "+", "-", "("stack_p = stack_p + 1str_stack(stack_p) = currentint_length2 = int_length2 - 1End SelectCase ")"Select Case stack_topCase ""msg = MsgBox("错误,没有匹配的“(”。

编译原理实验报告

编译原理实验报告

编译原理实验报告一、实验目的本次实验的目的是了解编译原理的基本知识,并运用所学知识实现一个简单的词法分析器。

二、实验内容1.设计一个词法分析器,能够识别并输出源程序中的关键字、标识符、常数和运算符等。

2.设计并实现一个词法分析器的算法。

3.对编写的词法分析器进行测试。

三、实验过程1.设计词法分析器的算法在设计词法分析器的时候,需要先了解源程序的基本构成,了解关键字、标识符、常数和运算符等的特点,以及它们在源程序中的表示形式。

然后,根据这些特点,设计一个适合的算法来进行词法分析。

2.实现词法分析器根据设计好的算法,在编程语言中实现词法分析器。

在实现过程中,需要根据不同的词法单元,设计相应的正则表达式来进行匹配和识别。

3.测试词法分析器编写几个简单的测试用例,对词法分析器进行测试。

检查输出结果是否正确,并根据实际情况对词法分析器进行调试和优化。

四、实验结果经过测试,词法分析器能够正确识别并输出源程序中的关键字、标识符、常数和运算符等。

测试用例的输出结果与预期结果一致。

五、实验总结通过本次实验,我学习了编译原理的基本知识,掌握了词法分析器的设计和实现方法。

在实验过程中,我遇到了一些困难和问题,但通过仔细思考和查阅文献资料,最终成功地完成了实验任务。

这次实验不仅帮助我巩固了所学知识,还提高了我的编程能力和解决问题的能力。

通过实践,我深刻体会到了编译原理在软件开发中的重要性和作用,并对将来的学习和工作有了更好的规划和方向。

通过本次实验,我对编译原理的相关知识有了更深入的理解和掌握,对词法分析器的设计和实现方法有了更加清晰的认识。

同时,我还学会了如何进行实验报告的撰写,提高了我的文档写作能力。

通过本次实验,我不仅实现了实验的目标,还提高了自己的综合素质和能力。

编译原理实验教案

编译原理实验教案

一、实验目的与要求1. 实验目的(1) 理解编译原理的基本概念和流程。

(2) 掌握常用的编译方法和技术。

(3) 熟练使用编译器开发工具。

2. 实验要求(1) 熟悉计算机专业基础知识。

(2) 掌握C/C++编程语言。

(3) 了解基本的编译原理。

二、实验环境1. 硬件环境(1) 计算机一台。

(2) 编译器开发工具(如GCC、Clang等)。

2. 软件环境(1) 操作系统(如Windows、Linux等)。

(2) 文本编辑器或集成开发环境(如Visual Studio、Eclipse等)。

三、实验内容1. 实验一:词法分析(1) 实现一个简单的词法分析器,识别出关键字、标识符、常量等。

(2) 分析输入的程序,输出词法分析结果。

2. 实验二:语法分析(1) 实现一个简单的语法分析器,根据给定的语法规则分析输入的程序。

(2) 分析输入的程序,输出语法分析树。

3. 实验三:语义分析(1) 实现一个简单的语义分析器,检查程序中的语义错误。

(2) 分析输入的程序,输出语义分析结果。

4. 实验四:中间代码(1) 实现一个简单的中间代码器,将转换为中间代码表示。

(2) 对输入的程序进行转换,输出中间代码。

5. 实验五:目标代码(1) 实现一个简单的目标代码器,将中间代码转换为目标代码。

(2) 对输入的中间代码进行转换,输出目标代码。

四、实验步骤与方法1. 实验一:词法分析(1) 编写词法分析器的代码。

(2) 测试并调试词法分析器。

2. 实验二:语法分析(1) 编写语法分析器的代码。

(2) 测试并调试语法分析器。

3. 实验三:语义分析(1) 编写语义分析器的代码。

(2) 测试并调试语义分析器。

4. 实验四:中间代码(1) 编写中间代码器的代码。

(2) 测试并调试中间代码器。

5. 实验五:目标代码(1) 编写目标代码器的代码。

(2) 测试并调试目标代码器。

五、实验注意事项1. 按照实验要求编写代码,注意代码规范和可读性。

编译原理实验报告小结

编译原理实验报告小结

一、实验背景编译原理是计算机科学的一个重要分支,主要研究如何将高级语言源代码转换为计算机可以执行的机器代码。

本实验旨在通过实践操作,加深对编译原理基本概念和算法的理解,提高编程能力和解决问题的能力。

二、实验目的1. 理解编译原理的基本概念和流程;2. 掌握词法分析和语法分析的基本方法;3. 熟悉编译过程中的中间代码生成和代码优化;4. 培养编程能力和团队协作精神。

三、实验内容1. 词法分析词法分析是编译过程的第一步,其主要任务是将源代码中的字符序列转换成一个个有意义的符号(单词)。

本实验中,我们实现了词法分析器,能够识别出标识符、关键字、运算符、常量等单词。

2. 语法分析语法分析是编译过程的核心,其主要任务是将词法分析器生成的单词序列按照一定的语法规则进行组织,形成语法树。

本实验中,我们实现了递归下降解析法,对表达式、赋值语句、函数定义等语法结构进行了分析。

3. 中间代码生成中间代码生成是编译过程中的一个重要环节,其主要任务是将语法树转换为一种抽象的、与具体机器无关的中间代码。

本实验中,我们实现了三地址代码生成,将语法树转换为三地址代码。

4. 代码优化代码优化是编译过程中的一个关键步骤,其主要任务是在保证程序正确性的前提下,提高程序的性能。

本实验中,我们实现了简单的代码优化,如常数传播、变量替换等。

四、实验结果与分析1. 实验结果通过实验,我们成功实现了词法分析、语法分析、中间代码生成和代码优化等功能。

以一个简单的C语言程序为例,我们能够将其转换为三地址代码,并进行简单的优化。

2. 实验分析(1)词法分析:本实验中,我们通过定义状态转换表和动作表,实现了对C语言源代码的词法分析。

实验结果表明,词法分析器能够准确地识别出标识符、关键字、运算符、常量等单词。

(2)语法分析:递归下降解析法是一种较为直观的语法分析方法。

本实验中,我们实现了递归下降解析法,对表达式、赋值语句、函数定义等语法结构进行了分析。

《编译原理》课程实验报告(词法分析)完整版

《编译原理》课程实验报告(词法分析)完整版

《编译原理》课程实验报告题目词法分析专业计算机指导教师签名华东理工大学信息学院计算机系2013年4月10日一.实验序号:《编译原理》第一次实验二.实验题目:词法分析三.实验日期:2013.3.27-2013.4.10四.实验环境(操作系统,开发语言)操作系统:Windows开发语言:C五.实验要求●修改词法:1)将标识符的词法改为“以大写字母或小写字母开头,后面可以跟大写字母或小写字母或数字或下划线”。

把while ((isalpha(buffer))||(isdigit(buffer)))改成while ((isalpha(buffer))||(isdigit(buffer))||buffer==’_’)2)将<条件>中的表示相等关系的单词“=”改为“= =”char *relation[6]={"<","<=","=",">",">=","<>"};把其中的=改成==即可3)将原来无小数的数改为可以有小数的数把while (isdigit(buffer))改成while (isdigit(buffer)||buffer==’.’)●用C语言开发词法分析程序。

读入用PL/0语言编写的测试用例源程序,将识别出的一个个单词组成单词流依序同时输出到屏幕和文件中。

六.实验步骤1)根据修改词法后的PL/0语言编写测试用例源程序。

2)用C语言编写词法分析程序。

读入PL/0语言的测试用例源程序,进行词法分析,将识别出的一个个单词组成单词流依序同时输出到屏幕和文件中。

3)设立断点,单步运行词法分析程序,依次单个输出单词。

分析和理解词法分析程序,解释词法分析程序中的数据和变量变化的原因和输出结果。

七.实验结果(测试用例源程序,运行结果部分截图,词法分析函数主要部分源程序PL0程序:const a=6,b=81;var x,y;procEdure p;procedure q;x:=2;beginx:=1;write(x);end;begincall p;end.C程序:#include <stdio.h>#include <ctype.h>#include <malloc.h>#include <stdlib.h>#include <string.h>#define NULL 0FILE *fp;char cbuffer;char*key[19]={"auto","break","case","char","const","continue","default","do"," double","else","enum","extern","float","for","goto","if","int","long","register"};char *border[6]={",",";","{","}","(",")"};char *arithmetic[4]={"+","-","*","/"};char *relation[6]={"<","<=","=",">",">=","<>"};char *consts[11]={"0","1","2","3","4","5","6","7","8","9","."};char *label[20];int labelnum=0;int search(char searchchar[],int wordtype){ int i=0;switch (wordtype) {case 1:for (i=0;i<=18;i++){ if (strcmp(key[i],searchchar)==0){return(1);}}return(0);break;case 2:{for (i=0;i<=5;i++){ if (strcmp(border[i],searchchar)==0)return(i+1);} return(0);}break;case 3:{for (i=0;i<=3;i++){ if (strcmp(arithmetic[i],searchchar)==0){ return(1);}}return(0);}break;case 4:{for (i=0;i<=5;i++){ if (strcmp(relation[i],searchchar)==0){ return(1);}}return(0);}break;case 5:{for (i=0;i<=10;i++){ if (strcmp(consts[i],searchchar)==0){return;}}return(0);}break;}}char alphaprocess(char buffer){ int atype;int i=-1;char alphatp[20];while ((isalpha(buffer))||(isdigit(buffer))){ alphatp[++i]=buffer;buffer=fgetc(fp);}alphatp[i+1]='\0';atype=search(alphatp,1);if(atype==1){printf("%s \t 保留字\n",alphatp);}//结束if(atype==0){printf("%s \t 标示符\n",alphatp);}return(buffer);}char digitprocess(char buffer){ int i=-1;char digittp[20];int dtype;while (isdigit(buffer)){ digittp[++i]=buffer;buffer=fgetc(fp);}digittp[i+1]='\0';dtype=search(digittp,5);if(dtype==1)printf("%s \t 数字\t %s\n",digittp,digittp);return(buffer);}char otherprocess(char buffer){ int i=-1;char othertp[20];int otype,otypetp;othertp[0]=buffer;othertp[1]='\0';otype=search(othertp,3);if (otype==1){ printf("%s \t 运算符\n",othertp);buffer=fgetc(fp);goto out;}otype=search(othertp,4);if (otype==1){ buffer=fgetc(fp);othertp[1]=buffer;othertp[2]='\0';otypetp=search(othertp,4);if (otypetp==1){ printf("%s \t 运算符\n",othertp);goto out;}elseothertp[1]='\0';printf("%s \t 运算符\n",othertp);goto out;}if (buffer==':'){ buffer=fgetc(fp);if (buffer=='=')printf(":= \t 运算符\n");buffer=fgetc(fp);goto out;}else{ if (otype=search(othertp,2)){ printf("%s \t 界符\n",othertp);buffer=fgetc(fp);goto out;}}if ((buffer!='\n')&&(buffer!=' '))printf("%c error,not a word\n",buffer);buffer=fgetc(fp);out: return(buffer);}void main(){if ((fp=fopen("example.txt","r"))==NULL)printf("error");else{cbuffer = fgetc(fp);while (cbuffer!=EOF){if (isalpha(cbuffer))cbuffer=alphaprocess(cbuffer);else if (isdigit(cbuffer))cbuffer=digitprocess(cbuffer);elsecbuffer=otherprocess(cbuffer);}printf("over\n");getchar();}}八.实验体会(词法分析程序修改的地方,解决问题的方法、心得体会等)通过本次试验,了解了词法分析的主要步骤,就是把标识符,保留字区分,并且能识别出空格,并把数据能从文件中读出来,主要识别标识符和保留字,主要通过比较参照一个事先建好的数组,里面包含了所有的保留字,不在其中的便是标识符。

编译原理实验课件

编译原理实验课件
2011-2-23 编译原理实验课件 5
实验步骤 1) 建立简单的符号表,可以只包含标识符和编号; 2) 编写单词解析子程序,从源程序中分离出单词; 3) 编写查找标识符的子程序(应考虑查找算法),插入 新的标识符; 4) 程序调试,输出标识符表。 实验数据的处理与实验报告要求 每个课题完成后写出实验报告。实验报告包括程序设计时考 虑的算法和方法;调试过程中出现的问题和解决的措施;打印 出程序清单和调试时所用的源程序。源程序清单中应该添加足 够的注释。
2
简单词法分析
1
设计
3 4
逆波兰式生成 表达式分析
1 1
设计 设计1-2-23
编译原理实验课件
4
实验一 查填符号表 实验目的 运用所学知识,选择语言、选择算法(数据结 构),编程实现符号表管理程序,读出源程序中的标识符,并 在符号表中进行查找,若存在则输出该标识符及其编号和位置; 否则将其填入符号表,并分配编号,确定位置,输出标识符表。 实验的基本原理 基于一种搜索算法,建立表示符表;利用界符进行单词解 析;运用文法(自动机)进行标识符识别。 实验内容及要求 运用所学知识,编程实现符号表管理程序,读出源程序中 的标识符,并在符号表中进行查找,若存在则输出该标识符及 其编号和位置;否则将其填入符号表,并分配编号,确定位置, 输出标识符表。
编译原理课程实验
编译程序是现代计算机系统的基本组成部分之一。“编译原理”是计 算机专业的一门重要专业课,同时也是一门实践性很强的课程,只有通过 实践,才能真正掌握。编译技术,作为一门计算机软件技术,内涵极为丰 富。有关词法、文法的分析,有关表格的处理,有关符号信息的处理方法, 有关清晰有效的算法描述方法,有关部门形形色色数据结构的运用,自动 机理论及其规划程序的指导作用。 通过实验环节,加强学生对所学编译原理知识的深入理解及熟练掌握, 为今后进行各种程序的编制和开发打下良好的基础。 要求在掌握理论知识的基础上,设计有关算法,编写程序,调试程序。 编程语言可为C或Java。 1) 正确理解什么是编译程序;了解编译程序工作的基本过程及其各阶 段的基本任务;熟悉编译程序的组成结构;了解编译程序的生成过程和构 造工具。

编译原理实验报告

编译原理实验报告

编译原理实验报告编译原理实验报告一、引言编译原理是计算机科学中的重要课程之一,它研究的是如何将高级语言程序转化为机器语言程序的过程。

在本次实验中,我们将学习并实践编译原理中的一些基本概念和技术,包括词法分析、语法分析和语义分析等。

二、词法分析词法分析是编译过程中的第一步,它负责将源程序中的字符序列转化为有意义的词法单元。

在本次实验中,我们使用了Flex工具来生成词法分析器。

通过定义一系列正则表达式和对应的动作,我们可以将源程序中的字符序列识别为不同的词法单元,如标识符、关键字、运算符等。

三、语法分析语法分析是编译过程中的第二步,它负责将词法单元序列转化为抽象语法树。

在本次实验中,我们使用了Bison工具来生成语法分析器。

通过定义一系列文法规则和对应的动作,我们可以将词法单元序列转化为抽象语法树,并进行语法错误的检测和恢复。

四、语义分析语义分析是编译过程中的第三步,它负责对抽象语法树进行语义检查和语义动作的执行。

在本次实验中,我们通过自定义语义规则和对应的动作,对抽象语法树进行类型检查、符号表管理等操作。

同时,我们还实现了一些简单的语义动作,如计算表达式的值、生成中间代码等。

五、中间代码生成中间代码生成是编译过程中的一项重要任务,它负责将源程序转化为机器无关的中间表示形式。

在本次实验中,我们使用了三地址码作为中间表示形式。

通过对抽象语法树的遍历和一系列的转换规则,我们可以将源程序转化为等价的三地址码表示形式。

六、实验结果与分析通过对一些简单的测试程序的编译,我们验证了我们所实现的词法分析、语法分析、语义分析和中间代码生成的正确性。

同时,我们还进行了一些性能测试,对比了不同算法和数据结构在编译过程中的效率差异。

实验结果表明,我们所实现的编译器在处理大规模程序时具有较好的性能。

七、结论通过本次实验,我们深入了解了编译原理中的一些基本概念和技术,并通过实践加深了对编译过程的理解。

同时,我们也意识到编译器的设计和实现是一项复杂而有挑战性的任务,需要综合运用多种算法和数据结构。

编译原理教程实验报告

编译原理教程实验报告

一、实验目的本次实验旨在使学生通过编译原理的学习,了解编译程序的设计原理及实现技术,掌握编译程序的各个阶段,并能将所学知识应用于实际编程中。

二、实验内容1. 词法分析2. 语法分析3. 语义分析4. 中间代码生成5. 代码优化6. 目标代码生成三、实验步骤1. 词法分析(1)设计词法分析器,识别输入源代码中的各种词法单元;(2)使用C语言实现词法分析器,并进行测试。

2. 语法分析(1)根据文法规则设计语法分析器,识别输入源代码的语法结构;(2)使用C语言实现语法分析器,并进行测试。

3. 语义分析(1)设计语义分析器,检查语法分析后的语法树,确保语义正确;(2)使用C语言实现语义分析器,并进行测试。

4. 中间代码生成(1)设计中间代码生成器,将语义分析后的语法树转换为中间代码;(2)使用C语言实现中间代码生成器,并进行测试。

5. 代码优化(1)设计代码优化器,对中间代码进行优化,提高程序性能;(2)使用C语言实现代码优化器,并进行测试。

6. 目标代码生成(1)设计目标代码生成器,将优化后的中间代码转换为特定目标机的汇编语言;(2)使用C语言实现目标代码生成器,并进行测试。

四、实验结果与分析1. 词法分析实验结果:成功识别输入源代码中的各种词法单元,包括标识符、关键字、运算符、常量等。

2. 语法分析实验结果:成功识别输入源代码的语法结构,包括表达式、语句、程序等。

3. 语义分析实验结果:成功检查语法分析后的语法树,确保语义正确。

4. 中间代码生成实验结果:成功将语义分析后的语法树转换为中间代码,为后续优化和目标代码生成提供基础。

5. 代码优化实验结果:成功对中间代码进行优化,提高程序性能。

6. 目标代码生成实验结果:成功将优化后的中间代码转换为特定目标机的汇编语言,为程序在目标机上运行做准备。

五、实验心得1. 编译原理是一门理论与实践相结合的课程,通过本次实验,我对编译程序的设计原理及实现技术有了更深入的了解。

编译原理中实验报告

编译原理中实验报告

实验名称:编译原理实验实验时间:2023年X月X日实验地点:实验室实验指导老师:XXX一、实验目的1. 理解编译原理的基本概念和流程。

2. 掌握词法分析和语法分析的基本方法。

3. 学习编译器生成中间代码和目标代码的过程。

4. 培养编程能力和问题解决能力。

二、实验内容本次实验主要包括以下内容:1. 词法分析:编写一个简单的词法分析器,将源代码输入转换为抽象语法树(AST)。

2. 语法分析:实现一个简单的递归下降解析器,对词法分析器输出的AST进行语法分析。

3. 中间代码生成:根据AST生成三地址代码(Three-Address Code)。

4. 代码优化:对生成的三地址代码进行优化。

5. 目标代码生成:将优化后的三地址代码转换为机器代码。

三、实验步骤1. 设计词法分析器首先,我们需要设计一个能够识别源代码中各种单词的词法分析器。

在本实验中,我们定义了以下几种单词:- 关键字:如if、else、while、int、float等。

- 标识符:由字母、数字和下划线组成,不能以数字开头。

- 常量:包括整型常量和浮点型常量。

- 运算符:如+、-、、/、==、<=等。

- 分隔符:如(、)、;、,等。

根据以上定义,我们可以编写一个词法分析器,它将输入的源代码字符串逐个字符地读取,并根据定义的规则识别出相应的单词。

2. 语法分析词法分析器生成的AST是一个树形结构,其中每个节点代表源代码中的一个单词或符号。

为了进一步分析AST的结构,我们需要实现一个递归下降解析器,它能够根据语法规则对AST进行解析。

在本实验中,我们以一个简单的算术表达式为例,实现了一个递归下降解析器。

解析器从AST的根节点开始,按照语法规则递归地解析每个子节点,直到整个表达式被解析完毕。

3. 中间代码生成在完成语法分析后,我们需要将AST转换为中间代码。

在本实验中,我们选择了三地址代码作为中间代码的形式。

三地址代码是一种表示赋值、条件判断和循环等操作的方式,它使用三个操作数和两个操作符来表示一个操作。

编译原理实验报告

编译原理实验报告
实验四: 设计一个表示01符号串集合的自动机,其中符号串至少包含1个0且长度必须大于等于2。并通过该自动机判断任意输入的符号串是否合法符号串。
实验五: 设计一个算法,求出任一上下文无关文法中所有导空符号,并输出。
实验六: 检查某段C源程序中,标识符的使用是否正确,即是否先声明后使用,或重复声明。假设数据类型只有int,float,double,char。
break;
}
if(temp[n*13+n2]=='k'&&zt[m]==0) //那些不能推出 空,但是因为要加入 其他非终结符的first集 而可能含有 空
n2++;
else if(n3>=n1) //for循环结束是因为n3而不是break ,即无相同字符
while(temp[n*13+n2]!='\0') //把z[n]对应的first加入temp[m*13+n1]这个first中,每个字符依次加在最后
{
for(n3=0;n3<n1;n3++) //循环判定是否有相同的字符
{
if(temp[m*13+n3]==temp[n*13+n2])
}
n++;
}
break; //break位于if(gs[n]==z2[m]),对于gs[n]已找到z2[m]完成任务跳出for循环
}
}
n2=m; //存放该for循环中m的值
n++;
}
//进一步处理集除去非终结符
m=0;n=0;n1=0;n2=0;
else n2++;

编译原理熟悉实验报告

编译原理熟悉实验报告

一、实验目的1. 理解编译原理的基本概念和流程;2. 掌握编译器的各个阶段及其实现方法;3. 熟悉编译器各个阶段中使用的算法和数据结构;4. 培养编程能力和问题解决能力。

二、实验内容1. 词法分析;2. 语法分析;3. 语义分析;4. 代码生成;5. 符号表;6. 中间代码生成。

三、实验步骤1. 词法分析(1)设计词法分析器:首先需要确定源程序中的词法单元,如标识符、关键字、运算符等。

然后,编写代码实现词法分析器,对源程序进行扫描,将词法单元转换成词法符号。

(2)实现词法分析器:使用C语言或Java等编程语言实现词法分析器,完成词法单元的识别和转换。

2. 语法分析(1)设计语法分析器:根据源程序的语言规范,设计语法分析器,实现语法规则的定义和匹配。

(2)实现语法分析器:使用递归下降分析法、LL(1)分析法、LR(1)分析法等实现语法分析器,对词法分析器输出的词法符号序列进行语法分析。

3. 语义分析(1)设计语义分析器:根据源程序的语言规范,设计语义分析器,实现语义规则的检查和类型检查。

(2)实现语义分析器:使用C语言或Java等编程语言实现语义分析器,完成语义规则的检查和类型检查。

4. 代码生成(1)设计代码生成器:根据源程序的语言规范,设计代码生成器,将抽象语法树转换成目标代码。

(2)实现代码生成器:使用C语言或Java等编程语言实现代码生成器,完成抽象语法树到目标代码的转换。

5. 符号表(1)设计符号表:在编译过程中,需要记录变量、函数等信息,设计符号表实现这些信息的存储和管理。

(2)实现符号表:使用C语言或Java等编程语言实现符号表,完成变量、函数等信息的存储和管理。

6. 中间代码生成(1)设计中间代码生成器:根据源程序的语言规范,设计中间代码生成器,将抽象语法树转换成中间代码。

(2)实现中间代码生成器:使用C语言或Java等编程语言实现中间代码生成器,完成抽象语法树到中间代码的转换。

四、实验结果与分析1. 词法分析器能够正确识别源程序中的词法单元,并将它们转换成词法符号。

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

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

编译原理实验报告实验一一、实验名称:词法分析器的设计二、实验目的: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 〈stdio.h〉#include <math.h>#include <string。

h>int i,j,k;char c,s,a[20],token[20]={’0’};int letter(char s){if((s〉=97)&&(s〈=122)) return(1);else return(0);}int digit(char s){if((s〉=48)&&(s<=57)) return(1);else return(0);}void get(){s=a[i];i=i+1;}void retract(){i=i-1;}int lookup(char token[20]){if(strcmp(token,"while")==0) return(1);else if(strcmp(token,"if")==0) return(2);else if(strcmp(token,"else”)==0) return(3);else if(strcmp(token,"switch”)==0) return(4);else if(strcmp(token,"case")==0) return(5);else return(0);}void main(){printf(”please input string :\n");i=0;do{i=i+1;scanf("%c",&a[i]);}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’:while(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;case ’0':case ’1’:case ’2':case ’3':case '4’:case '5’:case ’6':case ’7’:case ’8’:case '9’:while(digit(s)){token[j]=s;j=j+1;get();}retract();printf(”%d,%s",7,token);break;case '+':printf(”(’+',NULL)”);break;case ’-':printf("(’-',null)");break;case ’*':printf(”('*’,null)");break;case '<':get();if(s=='=’) printf(”(relop,LE)”);else{retract();printf("(relop,LT)");}break;case ’=':get();if(s=='=’)printf("(relop,EQ)");else{retract();printf(”('=',null)”);}break;case ’;':printf(”(;,null)");break;case ' ’:break;default:printf("!\n”);}j=0;get();} }六:实验结果:实验二一、实验名称:语法分析器的设计二、实验目的:用C语言编写对一个算术表达式实现语法分析的语法分析程序,并以四元式的形式输出,以加深对语法语义分析原理的理解,掌握语法分析程序的实现方法和技术.三、实验原理:1、算术表达式语法分析程序的算法思想首先通过关系图法构造出终结符间的左右优先函数f(a),g(a)。

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

成绩:
指导教师:
批阅时间: 年 月 日
1、 实验内容或题目
掌握并实现识别程序中关键字的方法,并编程实现。为词法分析打 基础。
2、 实验目的与要求
任意输入一段C语言程序,字符串中的每个单词用空格分隔,要求 识别出程序中的关键字。
3、 实验步骤与源程序
⑴ 实验步骤 1. 定义关键字表。可以考虑用字符数组定义。 2. 定义一个输出关键字的缓冲区。用字符数组实现即可。长度 可暂定为40。 3. 打开代码文件。 4. 从文件中读入单词 5. 判断单词是否是关键字
if ((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) //如果ch是 字母,则进行标识符处理
{ id[0]=ch; j=1;
//从文件中读入下一个字符 ch=getc(fin); while(isalnum(ch)) //如果是字母数字则组合标识符;如果
不是则标识符组合结束 {
电子信息学院 实验报告书
课 程 名: 《编译原理》 题 目: 实验五 词法分析(一) 实验类别 【设计】 班 级: 学 号: 姓 名:
评语:
实验态度:认真( ) 一般( ) 差( ) 实验结果:正确( ) 部分正确( )错( ) 实验理论:掌握( ) 熟悉( ) 了解( ) 不懂( ) 操作技能:强( ) 一般( ) 差( ) 实验报告:好( ) 一般( ) 差( )
int es=0,j,n; //es错误代码,0表示没有错误。j,n为临时变量, 控制组合单词时的下标等
printf("请输入源程序文件名(包括路径):"); scanf("%s",PL0Scanin);
if ((fin=fopen(PL0Scanin,"r"))==NULL) //判断输入文件名是否 正确
⑵ 源代码
#include <stdio.h>
#include <ctype.h>
# include <iostream>
//下面定义保留,为简化程序,使用字符指针数组保存所有保留字。
//如果想增加保留字,可继续添加,并修改保留字数目
#define keywordSum 3
//可根据需要添加保留字列表
if (n>=keywordSum) //不是保留字,输出标识符
符号
printf("%s\t%d\t%s\n",id,0,"IDENT"); //输出标识符
\t%d\t%s\n",strlwr(id),0,strlwr(id)); // 输出保留字符号
{ printf("\n打开词法分析输入文件出错!\n"); return(1);//输入文件出错返回错误代码1
} ch=getc(fin); while(ch!='\0'){//未读到文件结束
while (ch==' '||ch=='\n'||ch=='\t') ch=getc(fin); if (ch==EOF) break;
}
}
fclose(fin);//关闭输入输出文件
//fclose(fout);
return(es); //返回主程序
}
4、 测试数据与实验结果(可以抓图粘贴)
5、 结果分析与实验体会
//将读入的字符存放在id数组中,同时将数组下标增加1,准备容纳下 一个字符。
id[j++]=ch; ch=getc(fin); //读下一个字符
}
id[j]='\0'; //标识符组合结束
//查保留字
n=0;
//z在保留子表中查找保留字
while
((n<keywordSum)
&&
strcmp(strlwr(id),keyword[n])) n++;
char *keyword[keywordSum]={ "begin","main","void"};
char PL0Scanin[300];//用于接收输入输出文件名
FILE *fin; //用于指向输入输出文件的指针
int main()//词法分析函数
{
char ch,id[40]; //ch为每次读入的字符,id用于保存识别出的单 词
相关文档
最新文档