哈工大威海 编译原理实验报告

合集下载

编译原理 实验报告

编译原理 实验报告

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

在本次实验中,我们学习了编译原理的基本概念和技术,并通过实践来加深对这些概念和技术的理解。

本报告将对我们在实验中遇到的问题、解决方案以及实验结果进行总结和分析。

实验目的本次实验的主要目的是设计并实现一个简单的编译器,能够将类C语言的源代码翻译成目标代码。

通过这个实验,我们可以更好地理解编译器的工作原理,掌握编译器设计的基本方法和技术。

实验过程在实验中,我们首先对给定的类C语言的语法进行了分析,并根据语法规则设计了相应的语法分析器。

然后,我们使用了自顶向下的递归下降分析法来实现语法分析器。

在实现语法分析器的过程中,我们遇到了一些问题,例如如何处理语法规则中的左递归、如何处理语法规则中的优先级和结合性等。

通过仔细研究相关的文献和资料,我们成功地解决了这些问题,并完成了语法分析器的设计和实现。

接下来,我们对语法分析器进行了测试,并对测试结果进行了分析。

通过测试,我们发现语法分析器在处理简单的源代码时能够正确地识别出语法错误,并给出相应的错误提示。

然而,在处理复杂的源代码时,语法分析器可能会出现一些错误,例如无法正确地处理嵌套的语法结构、无法正确地处理运算符的优先级和结合性等。

为了解决这些问题,我们对语法分析器进行了改进,并进行了多次测试,最终得到了令人满意的结果。

实验结果通过本次实验,我们成功地设计并实现了一个简单的编译器,能够将类C语言的源代码翻译成目标代码。

在实验中,我们对编译器的工作原理有了更深入的了解,掌握了编译器设计的基本方法和技术。

同时,我们也发现了一些问题,并通过不断地改进和测试,最终得到了令人满意的结果。

结论编译原理是一门重要的计算机科学课程,它研究的是如何将高级语言程序转化为机器语言程序的过程。

通过本次实验,我们对编译原理的基本概念和技术有了更深入的了解,并通过实践来加深了对这些概念和技术的理解。

编译原理实验报告

编译原理实验报告

编译原理实验报告一、实验目的和要求本次实验旨在对PL_0语言进行功能扩充,添加新的语法特性,进一步提高编译器的功能和实用性。

具体要求如下:1.扩展PL_0语言的语法规则,添加新的语法特性;2.实现对新语法的词法分析和语法分析功能;3.对扩展语法规则进行语义分析,并生成中间代码;4.验证扩展功能的正确性。

二、实验内容1.扩展语法规则本次实验选择扩展PL_0语言的语句部分,添加新的控制语句,switch语句。

其语法规则如下:<switch_stmt> -> SWITCH <expression> CASE <case_list><default_stmt> ENDSWITCH<case_list> -> <case_stmt> , <case_stmt> <case_list><case_stmt> -> CASE <constant> : <statement><default_stmt> -> DEFAULT : <statement> ,ε2.词法分析和语法分析根据扩展的语法规则,需要对新的关键字和符号进行词法分析,识别出符号类型和记号类型。

然后进行语法分析,建立语法树。

3.语义分析在语义分析阶段,首先对switch语句的表达式进行求值,判断其类型是否为整型。

然后对case语句和default语句中的常量进行求值,判断是否与表达式的值相等。

最后将语句部分生成中间代码。

4.中间代码生成根据语法树和语义分析的结果,生成对应的中间代码。

例如,生成switch语句的跳转表,根据表达式的值选择相应的跳转目标。

5.验证功能的正确性设计一些测试用例,验证新语法的正确性和扩展功能的实用性。

三、实验步骤与结果1.扩展语法规则,更新PL_0语法分析器的词法规则和语法规则。

编译原理实验报告总结

编译原理实验报告总结

编译原理实验报告总结一、实验目的编译原理是计算机科学中的一门重要课程,通过实验可以更深入地理解编译过程的各个阶段,包括词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等。

本次编译原理实验的目的主要有以下几点:1、加深对编译原理理论知识的理解和掌握,将抽象的概念通过实际操作转化为具体的实现。

2、培养实际动手能力和解决问题的能力,通过编写代码实现编译程序的各个模块,提高编程技能和调试能力。

3、熟悉编译程序的开发流程和工具,掌握相关编程语言和开发环境的使用。

4、培养团队合作精神和沟通能力,在实验过程中与小组成员共同探讨、解决问题,提高协作效率。

二、实验环境本次实验使用的编程语言为 C/C++,开发环境为 Visual Studio 2019。

同时,使用了一些辅助工具,如调试工具、代码管理工具等,以提高开发效率和代码质量。

三、实验内容1、词法分析任务:使用正则表达式或有限自动机实现对输入源程序的词法分析,将源程序分解为一个个单词,并识别出单词的类型,如标识符、关键字、常量、运算符等。

实现方法:采用有限自动机的方法,设计状态转移图,根据输入字符的类型进行状态转移,最终确定单词的类型。

遇到的问题及解决方法:在处理一些边界情况时,如字符串中的转义字符,出现了识别错误。

通过仔细分析正则表达式和有限自动机的规则,对代码进行了相应的修改和完善,解决了问题。

2、语法分析任务:使用自顶向下或自底向上的语法分析方法,对词法分析得到的单词序列进行语法分析,构建语法树。

实现方法:选择了自顶向下的递归下降分析法,根据语法规则编写递归函数,逐个处理单词,构建语法树。

遇到的问题及解决方法:在处理复杂的语法结构时,出现了回溯和左递归的问题,导致分析效率低下。

通过消除左递归和提取公共因子,优化了语法分析算法,提高了分析效率。

3、语义分析任务:在语法分析的基础上,进行语义分析,检查语法正确的程序是否在语义上也是正确的,如类型匹配、变量未定义等。

哈工大威海 编译原理实验报告

哈工大威海 编译原理实验报告

附录:类 C 语言的词法文法 id Letter <temp> int10 Num int10 | Num OP +| - |* |/ |>| < | = | ( | ) | ; | ‘ | == | >= |<= | != Keywordif | then | else | while | do Lettera|b|c|d|e|f|g|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z|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 Num0|1|2|3|4|5|6|7|8|9 |ε <temp> Letter <temp> | Num <temp> |ε
一:系统功能分析与设计:
可对一段包含加减乘除括号的赋值语句进行语法分析,其必须以$为终结符,语句 间以;隔离,判断其是否符合语法规则,依次输出判断过程中所用到的产生式,并 输出最终结论。
二:开发平台(操作系统,设计语言)
Windows 7,Microsoft Visual C++ 6.0(Dos) ,C++
附录:简单类 c 语言文法 产生式 语义规则 注:P为文法的开始符号 说明语句部分文法: P→DS D →L id ; D |ε L → int | float 程序语句部分文法: S → id = E; S.code = E.code || gen(id.place’:=’E.place) S → if (C) S1 C.true = newlabel; C.false = S.next; S1.next = S.next; S.code = C.code || gen(C.true’:’) || S1.code S → if (C) S1 else S2 S → while (C) S1 do S2 C.true = newlabel; C.false = newlabel; S1.next = S2.next =S.next; S.code = C.code || gen(C.true’:’) || S1.code || gen(‘goto’S.next)|| gen(C.false’:’)|| S2.code; S → S ;S C → E1 > E2 C.code = E1.code || E2.code || gen(‘if’E1.place’>’E2.place’goto’C.true) || gen(‘goto’C.false) C → E1 < E2 C.code = E1.code || E2.code || gen(‘if’E1.place’<’E2.place’goto’C.true) || gen(‘goto’C.false) C → E1 == E2 C.code = E1.code || E2.code || gen(‘if’E1.place’=’E2.place’goto’C.true) || gen(‘goto’C.false) E → E1 + T E.place = newtemp; E.code = E1.code||T.code|| gen(E.place’:=’E1.place’+’T.place) E → E1 – T E.place = newtemp; E.code = E1.code || T.code ||

编译原理语法分析报告

编译原理语法分析报告
flag=false;
returnfalse;
}
}
returnflag;
}
publicstaticvoidmain(String args[]) {
LL l =newLL();
();
String input ="";
booleanflag =true;
while(flag) {
try{
InputStreamReader isr =newInputStreamReader;
booleanb = ();
"----------------------------------------------------------------------");
if(b){
"您输入的字符串"+input+"是该文发的一个句子");
}else{
"您输入的字符串"+input+"有词法错误!");
intfarWay = 14 - ();
for(intk=0; k<farWay; k++) {
" ");
}
farWay = 20 - ();
for(intk=0; k<farWay; k++) {
" &or(intk=0; k<farWay; k++) {
(二)思考题的思考与分析
思考题1:给出在生成语法分析表时所遇到的困难,以及是如何处理的
生成分析表时,需要用到栈,有很多难处,但是通过网络,逐渐还是解决了问题。
思考题2:思考还可以什么形式来给出语法分析的结果

哈工大威海c语言实验报告

哈工大威海c语言实验报告

哈工大威海c语言实验报告
哈工大威海C语言实验报告
在哈工大威海的C语言实验中,学生们通过实验课程深入了解了C语言的基本
概念和编程技巧。

本次实验报告将介绍实验的内容、过程和结果,以及学生们
的收获和体会。

实验内容主要包括C语言的基本语法、数据类型、运算符、控制语句、函数和
数组等内容。

学生们在实验课上通过实际编程操作,掌握了C语言的基本编程
技巧和方法,深入理解了C语言的特点和应用。

在实验过程中,学生们通过编写简单的程序,如求解两个数的和、差、积、商等,加深了对C语言基本语法和运算符的理解;通过编写控制语句和循环语句,如if语句、switch语句、while循环、for循环等,加深了对程序流程控制的理解;通过编写函数和数组,加深了对模块化编程和数据结构的理解。

实验结果表明,学生们在实验课上取得了较好的成绩,通过实际操作和编程练习,加深了对C语言的理解和掌握,提高了编程能力和解决问题的能力。

通过本次实验,学生们不仅学到了C语言的基本知识和技能,还培养了团队合
作精神和创新意识,提高了解决问题的能力和实际操作的能力。

实验课程的设
计和实施,为学生们提供了一个良好的学习平台,促进了他们的综合素质和能
力的提高。

总之,哈工大威海C语言实验报告是一次成功的实验课程,学生们通过实际操
作和编程练习,深入理解了C语言的基本概念和编程技巧,取得了较好的成绩,提高了编程能力和解决问题的能力。

这将为他们今后的学习和工作打下坚实的
基础。

哈工程编译原理实验报告 语法分析

哈工程编译原理实验报告 语法分析
n = 0;
/*初始化数组*/
while(n < MaxVnNum)
{
Vn[n++] = '\0';
}
n = 0;
while(('#' != ch) && (n < MaxVnNum))
{
if(' ' != ch && '\n' != ch && -1 == IndexCh(ch))
{
Vn[n++] = ch;
{
printf("\n是否继续进行句型分析?(y / n):");
todo = getchar();
while('y' != todo && 'n' != todo)
{
printf("\n(y / n)? ");
todo = getchar();
}
if('y' == todo)
{
int i;
InitStack();
void First(int U);
void AddFirst(int U, int nCh); /*加入first集*/
bool HaveEmpty(int nVn);
void Follow(int V);/*计算follow集*/
void AddFollow(int V, int nCh, int kind);
当一个文法中存在ε产生式时,例如,存在A→ε,只有知道哪些符号可以合法地出现在非终结符A之后,才能知道是否选择A→ε产生式。这些合法地出现在非终结符A之后的符号组成的集合被称为FOLLOW集合。下面我们给出文法的FOLLOW集的定义。

哈尔滨工业大学(威海)操作系统实验报告及答案

哈尔滨工业大学(威海)操作系统实验报告及答案

哈尔滨工业大学(威海)操作系统实验报告说明:本实验报告实验答案,是本人在上实验时的测试数据,由于操作系统实验中后面实验与当时所做实验的计算机的配置有关,因此本实验报的数据仅供参考。

实验1进程的描述与控制Windows 2000编程(实验估计时间:100分钟)1.1 背景知识Windows 2000 可以识别的应用程序包括控制台应用程序、GUI应用程序和服务应用程序。

控制台应用程序可以创建GUI,GUI应用程序可以作为服务来运行,服务也可以向标准的输出流写入数据。

不同类型应用程序间的惟一重要区别是其启动方法。

Windows 2000是以NT技术构建的,它提供了创建控制台应用程序的能力,使用户可以利用标准的C++工具,如iostream库中的cout和cin对象,来创建小型应用程序。

当系统运行时,Windows 2000的服务通常要向系统用户提供所需功能。

服务应用程序类型需要ServiceMail()函数,由服务控制管理器(SCM)加以调用。

SCM是操作系统的集成部分,负责响应系统启动以开始服务、指导用户控制或从另一个服务中来的请求。

其本身负责使应用程序的行为像一个服务,通常,服务登录到特殊的LocalSystem账号下,此账号具有与开发人员创建的服务不同的权限。

当C++编译器创建可执行程序时,编译器将源代码编译成OBJ文件,然后将其与标准库相链接。

产生的EXE文件是装载器指令、机器指令和应用程序的数据的集合。

装载器指令告诉系统从哪里装载机器代码。

另一个装载器指令告诉系统从哪里开始执行进程的主线程。

在进行某些设置后,进入开发者提供的main()、Servicemain()或WinMain()函数的低级入口点。

机器代码中包括控制逻辑,它所做的事包括跳转到Windows API函数,进行计算或向磁盘写入数据等。

Windows允许开发人员将大型应用程序分为较小的、互相有关系的服务模块,即动态链接库(DLL)代码块,在其中包含应用程序所使用的机器代码和应用程序的数据。

大学编译原理实验报告

大学编译原理实验报告

一、实验名称编译原理实验二、实验目的1. 理解编译原理的基本概念和原理。

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

3. 学会使用编译工具,如Lex和Yacc,实现简单的编译器。

三、实验内容本次实验主要分为三个部分:1. 词法分析2. 语法分析3. 编译器构建四、实验步骤1. 词法分析- 使用Lex工具实现词法分析器。

- 定义输入文件格式,包括源代码和标记。

- 编写Lex规则,将源代码转换为标记序列。

- 使用Flex生成词法分析器程序。

2. 语法分析- 使用Yacc工具实现语法分析器。

- 定义语法规则,包括产生式和文法符号。

- 编写Yacc规则,将标记序列转换为语法分析树。

- 使用Bison生成语法分析器程序。

3. 编译器构建- 将词法分析器和语法分析器程序结合,构建简单的编译器。

- 实现编译器的中间代码生成功能。

- 实现编译器的目标代码生成功能。

五、实验结果1. 词法分析- 输入:`int a = 10;`- 输出:`TOKEN: int, TOKEN: a, TOKEN: =, TOKEN: 10, TOKEN: ;`2. 语法分析- 输入:`int a = 10;`- 输出:`Syntax Tree: Program -> Declaration -> Variable Declaration -> Identifier -> a, Token -> int, Token -> =, Token -> 10, Token -> ;`3. 编译器构建- 输入:`int a = 10;`- 输出:`Target Code: int a = 10;`六、实验心得1. 通过本次实验,我深入理解了编译原理的基本概念和原理,包括词法分析、语法分析和编译器构建。

2. 我学会了使用Lex和Yacc等编译工具,实现了简单的编译器。

3. 本次实验让我认识到编译原理在软件开发中的重要性,以及编译器在代码生成和优化方面的作用。

哈工大(威海)c语言实验报告册答案

哈工大(威海)c语言实验报告册答案

实验1简单判定性问题求解一、实验学时完成本实验需4学时。

二、实验目的1、阅读程序题(1)掌握C语言数据类型,熟悉如何定义一个整型、字符型的变量,以及对它们赋值的方法;(2)掌握不同的类型数据之间赋值的规律;(3)掌握数据在内存中的存储方式;(4)学会输入、输出函数的基本格式和使用方法;(5)学会使用有关算术运算符、逻辑运算符、关系运算符,以及包含这些运算符的表达式。

2、编程题(1)如何运用判定性结构进行程序设计;(2)如何运用判定性结构进行程序设计。

3、调试题(1)熟悉C程序的编辑、编译、连接和运行的过程。

三、实验指导为了达到最佳的实验效果,以下提供几条适于编程的指导意见,可供参考。

1、阅读程序题应先运用自己在课堂所学的知识,推导出结果,在上机时输入计算机,印证自己推导的结果,注意观察数据在内存中的存储方式、含不同种运算符表达式的输出结果。

2、编程题必须首先画出流程图,并反复思考判断程序设计的正确性,完成程序的设计。

要注意简单判定性问题的结构选择。

3、调试题应明确程序的调试、测试是一项非常烦琐的工作,也是非常重要的工作。

对于初学者来说应该建立良好的习惯,在调试程序的时候,应该尽可能考虑到程序运行时各种可能情况。

四、实验内容1、阅读程序题(1)( ){ /*定义字符型变量*/c12; /*向字符变量赋以整数*/c1=97;c2=98;(" \n"12); /*以字符形式输出*/(" \n"12); /*以整数形式输出*/}该程序的输出结果是思考:可否改成 c1,c2;输出结果是?相同(2)(){75;("\n");}思考:若将语句中变为,可否输出分式的值?可以(3)(){9;; /*包含复合的赋值运算符的赋值表达式*/("\n");}思考:赋值表达式a+=a-=a+a的求解步骤?第一步:()9 第二步18(4)(){1;("\n");}出结果是思考:-1在内存中的存储形式?取反加一11111111111111111111111111111111(32个)(5)(){x1;1;x1; /*有符号数据传送给无符号变量*/(""1);}思考:(有符号赋值给无符号)(6)(){345;("\n",(!(a<b))(1));("");}思考:若将第一个语句中变为,结果将如何?1(换行)6(7)(){ 123;() ("\n");("\n");}该程序的输出结果是 1 。

哈工大威海编译原理实验三语义分析与中间代码生成(DOC X页)

哈工大威海编译原理实验三语义分析与中间代码生成(DOC X页)

哈工大威海编译原理实验三语义分析与中间代码生成(DOCX页)哈尔滨工业大学(威海)计算机学院编译原理实验报告姓名院系计算机学院学号 090410任课教师指导教师实验地点宋健二楼机房实验时间实验三语义分析及中间代码生成实验名称同组人无预习报告(对实验主要内容的认识) 得分(1) 通过本次试验,我应该加深对于编译原理制导方案的理解,并且加深对于语法变换的所起到的作用;(2) 对于试验中要用到得中间代码的格式规范,也应该进一步的分析和掌握(3) 能够很好的使用到前面开发出来的词法分析器和语法分析器,将它们与语义分析器结合起来,跟好的更系统的掌握编译原理这门专业技能 (4) 关于符号表以及token串表的维护,现在终于使其有所作用实验内容(问题,思路,程序,结果) 得分(1)开发环境:vs2010(2)输入:在运行打开的软件下(win32格式),输入相应的代码(即要进行词法分析的字符串)(比如:int a;)(3)输出:在输入字符串后,按回车键后,既可以得到相应的词法分析的结果(比如:int a 的输入对应的输出如下:int a;首先对于词法分析打印出:Int --- key //关键字A ---str //字符串; ---bor //边界符号对于语法分析:Accept //编译语句分析成功对于输入字符串的语义分析和中间代码的生成如下中间代码:)(4)在相应的运行程序的文件夹中生成一个txt文件,用来存储生成的Token 链表(5)系统功能:(2) 开发平台(操作系统、设计语言):1、操作系统:windows 72、设计语言:c++3、编译器:vs2010(3) 设计方案;1) 主数据流图开始词法分析Token表的生成及修改语法分析修改token表语义分析语句是否为变量声明对语句按照文法的action表进行归约加一个四元式结点向下进行语义分析生成中间代码结束2) 主要数据结构:符号表、TOKEN串表等。

编译原理实验报告小结

编译原理实验报告小结

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

编译原理实验报告

编译原理实验报告

编译原理实验报告一、实验目的编译原理是计算机科学中的一门重要课程,通过实验,旨在加深对编译原理相关理论知识的理解,提高实践动手能力和问题解决能力。

具体目标包括:1、熟悉编译程序的基本结构和工作流程。

2、掌握词法分析、语法分析、语义分析及中间代码生成等主要阶段的实现方法。

3、培养运用编程语言实现编译算法的能力。

二、实验环境本次实验使用的编程语言为_____,开发工具为_____,操作系统为_____。

三、实验内容(一)词法分析词法分析是编译过程的第一个阶段,其任务是从输入的源程序中识别出一个个单词符号。

使用正则表达式和有限自动机的理论,设计并实现了词法分析器。

首先,定义了单词的类别,如标识符、关键字、运算符、常量等。

然后,根据不同单词类别的特征,编写了相应的正则表达式模式。

在实现过程中,通过对输入的源程序进行逐字符扫描,利用正则表达式匹配来识别单词,并将其分类存储。

(二)语法分析语法分析是编译过程的核心部分,其目的是确定输入的单词序列是否符合给定的语法规则。

采用了自顶向下的递归下降分析法和自底向上的算符优先分析法。

对于递归下降分析法,根据语法规则编写了相应的递归函数。

每个函数处理一种语法结构,通过递归调用实现对整个语法的分析。

算符优先分析法则通过定义算符的优先级和结合性,构建算符优先关系表,然后依据表进行语法分析。

(三)语义分析语义分析阶段主要检查语法正确的句子是否具有实际的意义,并进行类型检查、语义计算等操作。

在实现中,通过构建符号表来记录变量的信息,包括名称、类型、作用域等。

同时,在语法分析的过程中,根据语义规则进行相应的检查和计算。

(四)中间代码生成中间代码生成是将源程序转换为一种便于优化和目标代码生成的中间表示形式。

选择了三地址码作为中间代码。

在生成中间代码时,根据语法分析和语义分析的结果,按照一定的规则将源程序转换为三地址码的形式。

四、实验步骤1、需求分析仔细研究实验要求,明确各个阶段的任务和目标,确定所需的数据结构和算法。

哈尔滨工程大学--编译原理实验--词法分析程序

哈尔滨工程大学--编译原理实验--词法分析程序

编译原理实验报告for(i=2;i<a_long&&a[i]!=’.’;i++)//将整数部分与小数部分分割开,并进行相应的换算x=x*16+(a[i]-48);for(i=strlen(a)—1;i>=0&&a[i]!='.’;i--)y=(y+(a[i]—48))/16;y=y+x; //整数部分与小数部分换算后相加printf("REAL16\t%f\n",y);//存入结构数组save(a,id,x,y);return;}printf("Wrong Enter");//所得的具体类型值为7,则输入有错误return ;}2、运行截图输入:98 00 –> tyy while实验总结本次的实验使我对词法分析的过程有了全新的了解,同时也明白了词法分析何时可以采用空格来区分单词,明白了程序设计中影响词法分析的效率的环节。

比如,关键字的识别过程。

因为当词法分析器识别出一个标识符时,就去和保留字表中的关键字进行比较,以确定它是否是关键字。

如果关键字和标识符比较少,标识符在表中采取顺序比较的时间还可以接受,但如果关键字和标识符都比较多,那么查询比较的平均时间就会比较长,就会影响到词法分析的效率.且每一次比较都是字符串之间的比较,也很耽误时间。

因此,我们讨论出了采取比较好的预选方式,如对标识符先进行筛选,有些不可能是关键字的标识符就可以不再与保留字表中的关键字进行比较了.如某种语言的关键字最长为8个字符,那么对于长度大过8的标识符被“筛下”了.当然进行“筛选”,也要付出一定的代价。

对于这次的实验,从中积累了很多的经验,同时也总结了一些编程出现的问。

编译原理教程实验报告

编译原理教程实验报告

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

二、实验内容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. 编译原理是一门理论与实践相结合的课程,通过本次实验,我对编译程序的设计原理及实现技术有了更深入的了解。

编译原理语法分析报告

编译原理语法分析报告

《编译原理》课程实验报告题目语法分析器的设计与实现专业软件工程________班级 __________学号 ________姓名 __________指导教师 ______哈尔滨工程大学软件学院2015年5月实验2 :语法分析'、实验目的1.巩固对语法分析的基本功能和原理的认识。

2.通过对语法分析表的自动生成加深语法分析表的认识。

3.理解并处理语法分析中的异常和错误。

二、实验内容本程序是基于已构建好的某一个语法的预测分析表来对用户的输入字符串进行分析,判断输否属于该文法的句子。

基本实现思想:接收用户输入的字符串(字符串以“ # ”表示结束)后,对用做分析栈的一维析表的二维数组进行初始化。

然后取出分析栈的栈顶字符,判断是否为终结符,若为终结符则判断且与当前输入符号一样,若是则语法分析结束,输入的字符串为文法的一个句子,否则出错若不为前输入符号一样则将栈顶符号出栈,当前输入符号从输入字符串中除去,进入下一个字符的分析。

且不与当前输入符号一样,则出错。

若栈顶符号为非终结符时,查看预测分析表,看栈顶符号和当前输入符号是否构成产生式,部为&,则将栈顶符号出栈,取出栈顶符号进入下一个字符的分析。

若不为&,将产生式的右部取出栈顶符号进入下一步分析。

程序流程图:本程序中使用以下文法作对用户输入的字符串进行分析:E—»TE'E'—+TE | £T—» FT'T'—*FT' | £F—i|(E)该文法的预测分析表为:代码:package ;import *public class LL {String Vn[] = { "E" , "E'" , "T" , "T'" , "F" }; ength();}for ( int k=0; k<l; k++) {"");}"“);I! I! );public void setl nputStr in g(Str ing in put) { in putString = in put;} public boolean judge() {Stri ng in putChar = (0, 1); quals( Vt [i])) { quals( in putChar)) {if ( fenxi [ count1 ].equals( "#" )&&()==1) { ength());} else { quals( Vn[i])) {cou nt3 = i;break ;}if ( P[count3 ][ count2 ] != "error" ) { //栈顶的非终结符与输入的终结符存在产生式时String p = P[ count3 ][ count2 ];String si = (2, ()); // 获取对应的产生式if ( " £" )) { //产生式推岀“ J'时String fenxizhan = "” ;for ( int i=0; i<=; i++) {if ( fenxi [i] == null ) {break ;} else {fenxizhan = fenxizhan + fenxi [i];}}//输岀当前分析栈情况,输入字符串,所用产生式或匹配""+ count );String countToString = ( count );int farWay = 14 -();for ( int k=0; kvfarWay; k++) {"“);}farWay = 20 -();for ( int k=0; k<farWay; k++) {"“);}farWay = 25 -();for ( int k=0; k<farWay; k++) {"“);}+ P[ count3 ][ count2 ]);//将栈顶符号出栈,栈顶指针指向下一个元素fenxi [count1 ] = null counti -= 1;cou nt ++;judge();} else { //产生式不推岀"J'时int k =();String fenxizhan = "” ;for ( int i=0; i<=; i++) {if ( fenxi [i] == null ) { break ;} else {fen xizha n = fen xizha n +fenxi [i];("'")){s2 = () - 1, ())+ s2; i++; si = (0, () - 1);}fenxi [ cou nt1 ] = s2; if (i < k)cou nt1 ++;// "cou nt1=" + cou nt1);// " "+count+" "+fenxizhan+" // "+i nputStri ng +" "+P[cou nt3][cou nt2]); cou nt ++; //judge();}} else {"分析到第“ + count + "步时岀错! “);flag = false ; return false ;}}return flag ;//输岀当前分析栈情况,输入字符串,所用产生式或匹配 ""+count );Stri ng cou ntToStri ng =( int count );for for for forfarWay = 14 -();(int o=0; o<farWay; o++) {"“);farWay = 20 -();(int o=0; ovfarWay; o++) {"“);farWay = 25 -();(int o=0; o<farWay; o++) {"“);P[ count3 ][ count2 ]);(int i=1; i<=k; i++) { Stri ng s2 = () - 1,());=(0, () - 1); //将产生式右部的各个符号入栈siifpublic static void main(String args[]) {LL l = new LL();();Stri ng in put = "";boolean flag = true ;while (flag) {try {In putStreamReader isr = n ewI nputStreamReader;BufferedReader br = new BufferedReader(isr);"请输入字符串(输入exit退岀):“); in put =();} catch (Exception e) {();}if ("exit" )){flag = false ;} else {(in put);(1,1, 0, 0);();"分析过程“);I!I!剩余输入串 1I!);所用产生式“);" 步骤|I!分析栈 1boolean b =(););I!I!);if (b){"您输入的字符串"+i nput+ "是该文发的一个句子");}else {"您输入的字符串"+i nput+ "有词法错误!");}}}}}三、实验结果1、显示预测分析表,提示用户输入字符串2、输入的字符串为正确的句子3、输入的字符串中包含了不属于终结符集的字符4、输入的字符串不是该文法能推导出来的句子四、实验中遇到的问题总结主要阐述两方面的问题(一)实验过程中遇到的问题如何解决的?实验中遇到的问题,通过查书、和上网搜索资料解决问题。

编译原理中实验报告

编译原理中实验报告

实验名称:编译原理实验实验时间: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转换为中间代码。

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

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

编译原理熟悉实验报告

编译原理熟悉实验报告

一、实验目的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班学号:* * * ***** 姓名:* * * 一、实验目的通过本实验的编程实践,使学生了解词法分析的任务,掌握词法分析程序设计的原理和构造方法,使学生对编译的基本概念、原理和方法有完整的和清楚的理解,并能正确地、熟练地运用。

二、实验内容及要求用VC++/VB/JAVA语言实现对C语言子集的源程序进行词法分析。

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

以下是实现词法分析设计的主要工作:(1)从源程序文件中读入字符。

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

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

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

(属性值——token的机内表示) (5)如果发现错误则报告出错(6)根据需要是否填写标识符表供以后各阶段使用。

单词的基本分类:u 关键字:由程序语言定义的具有固定意义的标识符。

也称为保留字例如if、for、while、printf ;单词种别码为1。

u 标识符:用以表示各种名字,如变量名、数组名、函数名;u 常数:任何数值常数。

如125, 1,0.5,3.1416;u 运算符:+、-、*、/;u 关系运算符:、=、= 、、=、;u 分界符:;、,、(、)、[、];三、实验程序设计说明1.实验方案设计1、主程序设计考虑:u 程序的说明部分为各种表格和变量安排空间。

在具体实现时,将各类单词设计成结构和长度均相同的形式,较短的关键字后面补空。

k数组------关键字表,每个数组元素存放一个关键字(事先构造好关键字表)。

s 数组------存放分界符表(可事先构造好分界符表)。

为了简单起见,分界符、算术运算符和关系运算符都放在s表中(编程时,应建立算术运算符表和关系运算符表,并且各有类号),合并成一类。

哈工大编译原理实验报告

哈工大编译原理实验报告

14 ; 6 } 8 mean 19 = 8 sum 18 / 8 temp 14 ; 24 if 3 ( 8 mean 22 >= 11 60 4 ) 5 { 8 mean 19 = 8 mean 16 11 60 14 ; 26
printf 3 ( 28 "the score of studen t number %d is %f higher than 60.\n" 12 , 8 stu_nu mber 12 , 8 mean 4 ) 14 ; 6 }
6 } 14 ; 1 int 8 stu_nu mber 14 ; 7 float 8 mean 12 , 8 sum 14 ; 1 int 8 temp 14 ; 1 int 8 i 14 ; 26 printf 3 ( 28
"pleas e input your studen t number :" 4 ) 14 ; 27 scanf 3 ( 28 "%d" 12 , 29 & 8 stu_nu mber 4 ) 14 ; 8 sum 19 =
struct Token{ int tag; //类别码 string val; //类别名 }; char c; //当前字符 5. 关键函数 extern bool init_tokenmap(); //初始化 token_map 表 extern bool open_anafile(); //打开输入文件和输出文件函数 extern bool close_anafile(); //关闭输入文件和输出文件函数 extern Token process_number(); //常数处理函数 extern Token process_aplha(); //关键字和标示符处理函数 extern Token process_string(); //字符串处理函数 extern Token get_next_token(); //得到 token 字的函数 extern void writetofile(Token tok); //将 token 字写入文件的函数 extern void print_token(Token tok); //将 token 字输出屏幕打印的函数 6.输入与输出测试 此部分输入为示例程序,输出为写到文件中的 token 序列。 输入程序:
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

3.设计方案: (1)主流程图:
开始
读入文件
CiFaFenXi()函数进行词法分析
关闭文件流
结束
(2)主要子程序的流程框图: 判断 是否注释子模块①:
开始
输入文件, 读完文件
N
是否为注释?

继续判断 不处理
模块① 判断是否是字符子模块②:
开始
N
是否为字符?

字符临时赋值给字符串变量 继续别的判断
读取下一字符
{0,0,0,0,0,207,0,0,0,0,0,0,0,0,0,0,0,0,0,0} 符号表: struct TokenTable { char *type; int attr; }TokenTable[1000];
具体思路: 首先对源文件进行词法分析, 然后产生符号表 FenXiTable () , 然后对词法分析产生的 Token 进行语法分析,用分析栈和分析表进行 GOTO 和 ACTION 函数进行语法分析。
实验二 LR语法分析器设计 一 实验目的 通过设计调试 LR 语法分析程序,实现根据词法分析的输入 TOKEN 字,进行 文法的语法分析;加深对课堂教学的理解;提高语法分析方法的实践能力。 二 实验内容 使用附录中的文法,可以对类似下面的程序语句进行语法分析: int a; int b; int c; a=2; b=1; if (a>b) c=a+b; else c=a-b; 三 实验要求 (一) 程序设计要求 (1)给出主要数据结构:分析栈、符号表; (2)将扫描器作为一个子程序,每次调用返回一个 TOKEN; (3)程序界面:表达式输入、语法分析的表示结果(文件或者图形方式) ; (二)实验报告撰写要求 (1)系统功能分析与设计(包括各个子功能模块的功能说明) ; (2)开发平台(操作系统、设计语言) ; (3)设计方案:包括功能模块结构图、主要函数的流程图; (4)主要数据结构:分析栈、分析表、符号表; (5)具体设计实现过程(包括主控程序、各个功能模块的具体实现) 。 四 实验总结
int a; int b; int c; a=2; b=1;
if (a>b) c=a+b; else c=a-b; 子功能模块有: 关键字处理过程;字母的处理过程;数字的处理过程;整个词法分析处理过程;运算 符处理过程以及主程序。
2.开发平台(操作系统、设计语言) ; Windows 7,Microsoft Visual C++ 6.0
五:具体实现过程: Main 函数:
开始
输入源文件
词 法分 析建 立符 号表
语法分析 LR() 进 行语法分析
输出结果
结束
词法分析流程:
开始
读入文件
CiFaFenXi()函数进行词法分析
关闭文件流
结束
实验结果:
总结:通过这次语法分析 LR(0)实验,我加深了对语法分析的理解,并且能熟练
利用分析表进行 GOTO 函数和 ACTION 函数的应用,以前在书本上学到的东西,没有 实验之前都很抽象,但是自己通过实验,利用数组产生了分析表,对 LR(0)自动机 也有了很深的理解!
《编译原理》
实验报告
班级: 学号: 姓名:
实验一 词法扫描器设计 一 实验目的 通过设计调试词法分析程序,实现从源程序中分出各种单词的方法;加深对课 堂教学的理解;提高词法分析方法的实践能力。 二 实验内容 设计一个简单的类 C 语言的词法扫描器。 三 实验要求 (一) 程序设计要求 (1) 根据附录给定的文法,从输入的类 C 语言源程序中,识别出各个具有独 立意义的单词,即关键字、标识符、常数、运算符、分隔符五大类;文 法见最后附录。 (2) 提供源程序输入界面; (3) 词法分析后可查看符号表和 TOKEN 串表; (4) 保存符号表和 TOKEN 串表(如:文本文件) ; (5) 遇到错误时可显示提示信息,然后跳过错误部分继续进行分析。 (二)实验报告撰写要求 (1) 系统功能(包括各个子功能模块的功能说明) ; (2) 开发平台(操作系统、设计语言) ; (3) 设计方案; 1) 主数据流图; 2) 主要子程序的流程框图(若有必要) ; 3) 模块结构图; 4) 主要数据结构:符号表、TOKEN 串表等。 (4) 具体设计过程(包括主控程序、各个功能模块的具体实现) 。 1.系统功能: 根据附录给定的文法,从输入的类 C 语言源程序中,识别出各个具有独立意义的 单词,即关键字、标识符、常数、运算符、分隔符五大类。然后输出本源程序的符 号表显示在 dos 界面和存放在文本文件中。本程序以如下源程序(语法分析的例子) 示范: 源程序;
附录:类 C 语言的词法文法 id Letter <temp> int10 Num int10 | Num OP +| - |* |/ |>| < | = | ( | ) | ; | ‘ | == | >= |<= | != Keywordif | then | else | while | do Lettera|b|c|d|e|f|g|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z|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 Num0|1|2|3|4|5|6|7|8|9 |ε <temp> Letter <temp> | Num <temp> |ε
一:系统功能分析与设计:
可对一段包含加减乘除括号的赋值语句进行语法分析,其必须以$为终结符,语句 间以;隔离,判断其是否符合语法规则,依次输出判断过程中所用到的产生式,并 输出最终结论。
二:开发平台(操作系统,设计语言)
Windows 7,Microsoft Visual C++ 6.0(Dos) ,C++
附录:简单类 c 语言文法 产生式 语义规则 注:P为文法的开始符号 说明语句部分文法: P→DS D →L id ; D |ε L → int | float 程序语句部分文法: S → id = E; S.code = E.code || gen(id.place’:=’E.place) S → if (C) S1 C.true = newlabel; C.false = S.next; S1.next = S.next; S.code = C.code || gen(C.true’:’) || S1.code S → if (C) S1 else S2 S → while (C) S1 do S2 C.true = newlabel; C.false = newlabel; S1.next = S2.next =S.next; S.code = C.code || gen(C.true’:’) || S1.code || gen(‘goto’S.next)|| gen(C.false’:’)|| S2.code; S → S ;S C → E1 > E2 C.code = E1.code || E2.code || gen(‘if’E1.place’>’E2.place’goto’C.true) || gen(‘goto’C.false) C → E1 < E2 C.code = E1.code || E2.code || gen(‘if’E1.place’<’E2.place’goto’C.true) || gen(‘goto’C.false) C → E1 == E2 C.code = E1.code || E2.code || gen(‘if’E1.place’=’E2.place’goto’C.true) || gen(‘goto’C.false) E → E1 + T E.place = newtemp; E.code = E1.code||T.code|| gen(E.place’:=’E1.place’+’T.place) E → E1 – T E.place = newtemp; E.code = E1.code || T.code ||

输入小数 | 指数 | 小数点
N
将变量 类型 3 写入结果
模块③
实验结果:
Test.txt 内容:
Token.txt 文件内容:
四 实验总结: 通过词法分析实验,首先我认识到词法分析就是将字符序列转换为单词(Token) 序列的过程。词法分析器一般以函数的形式存在,供语法分析器调用。词法分析阶 段是编译过程的第一个阶段,这个阶段的任务是从左到右一个字符一个字符地读入 源程序, 即对构成源程序的字符流进行扫描然后根据构词规则识别单词(也称单词符 号或符号)。并且对符号表有了一定的理解,符号表是: 1、编译过程中编译程序不断汇集和反复查证出现在源程序中各种名字的属性和 特征信息等有关信息。 这些信息通常记录在一张或几张符号表中。 2、符号表的每一项有两部分: 一部分是名字(标识符) ;一部分是名字属性(标识符的有关信息) 。 3、编译过程中,每当扫描器(词法分析器)识别出一个名字后,编译程序就查 阅符号表,看其是否在符号表中。 如果它是一个新名字就将它填进表里。 它的有关信息将在词法分析和语法-语义分析过程中陆续填入表中。 4、符号表是边填边用。

是否为字符或 者数字?
N
字符串变量是 否是关键字?

将变量 类型 1 输出到 DOS 界面并写入文件 将变量 类型 2 输出到 DOS 界面并写入文件
结束
模块② 判断是否为数字或者运算符子模块③:
开始
N
是否为数字? 是 否 为 运 算 符?Y源自将数字赋给变 量Y
对每一个运算 符做相应的处 理
读取下一变量
三:设计方案: (包括第四步的数据结构) 首先构造数据结构,分析栈,分析表,符号表等如下:
分析栈 struct FenXiZhan { char name[50]; char *type; int value; }FenXiZhan[1000]; 分析表() Table[31][20] {108,0,0,0,0,0,0,0,0,0,0,0,0,1,2,0,4,0,0,0}, {0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,0,0,0}, {0,0,109,0,0,0,0,0,0,0,0,113,0,0,0,3,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,201,0,0,0,0,0,0,0,0,0}, {0,0,105,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,106,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {108,0,203,0,0,0,0,0,0,0,0,203,0,0,7,0,4,0,0,0}, {0,0,202,0,0,0,0,0,0,0,0,202,0,0,0,0,0,0,0,0}, {0,0,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,126,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,11,25}, {0,112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,205,0,205,0,0,0,0,0,0,0}, {0,0,0,0,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,126,0,0,0,0,0,0,127,0,0,0,0,0,0,0,15,28,25}, {0,0,0,0,0,116,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,109,0,0,0,0,0,0,0,113,0,0,0,0,17,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,118,0,0,0,0,0,0,0}, {0,0,109,0,0,0,0,0,0,0,113,0,0,0,0,19,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,206,0,206,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,121,123,0,0,0,0,0,0,0,0,0,0,0}, {0,0,126,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,22}, {0,208,0,0,0,0,208,208,208,0,0,0,0,0,0,0,0,0,0,0}, {0,0,126,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,24}, {0,209,0,0,0,0,209,209,209,0,0,0,0,0,0,0,0,0,0,0}, {0,210,0,0,0,0,210,210,210,0,0,0,0,0,0,0,0,0,0,0}, {0,211,0,0,0,0,211,211,211,0,0,0,0,0,0,0,0,0,0,0}, {0,212,0,0,0,0,212,212,212,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,129,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,126,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,30,25},
相关文档
最新文档