编译原理实验

合集下载

编译原理实验报告

编译原理实验报告

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

编译原理 实验

编译原理 实验

编译原理实验编译原理实验。

编译原理是计算机科学中的一个重要领域,它研究的是编译器的设计和实现原理。

编译器是将高级语言代码转换成机器语言代码的程序,它在软件开发过程中起着至关重要的作用。

而编译原理实验则是帮助学生深入理解编译原理的重要手段之一,通过实际操作来加深对编译原理知识的理解和掌握。

在编译原理实验中,我们需要掌握以下几个关键点:1. 词法分析,词法分析是编译过程中的第一步,它负责将源代码分割成一个个的单词(Token)。

在词法分析实验中,我们需要实现一个词法分析器,能够正确地识别出源代码中的各种单词,并进行分类和标记。

2. 语法分析,语法分析是编译过程中的第二步,它负责将词法分析得到的单词序列转换成抽象语法树。

在语法分析实验中,我们需要实现一个语法分析器,能够根据给定的文法规则,将单词序列转换成抽象语法树,并进行语法检查。

3. 语义分析,语义分析是编译过程中的第三步,它负责对抽象语法树进行语义检查和翻译。

在语义分析实验中,我们需要实现一个语义分析器,能够对抽象语法树进行类型检查、作用域分析等,并生成中间代码。

4. 代码生成,代码生成是编译过程中的最后一步,它负责将中间代码转换成目标机器代码。

在代码生成实验中,我们需要实现一个代码生成器,能够将中间代码转换成目标机器代码,并进行优化。

通过以上实验,我们可以深入理解编译原理的各个环节,并掌握编译器的设计和实现原理。

同时,实验过程中还能培养我们的动手能力和解决问题的能力,为今后的软件开发打下坚实的基础。

总之,编译原理实验是非常重要的,它能够帮助我们深入理解编译原理知识,提高我们的动手能力和解决问题的能力。

希望大家能够认真对待编译原理实验,从中获得更多的收获和成长。

编译原理实验报告总结

编译原理实验报告总结

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

山大编译原理实验报告(3篇)

山大编译原理实验报告(3篇)

第1篇一、实验目的1. 理解编译原理的基本概念和原理。

2. 掌握编译过程的基本步骤。

3. 熟悉编译器开发工具和环境。

4. 培养动手实践能力和团队协作精神。

二、实验环境1. 操作系统:Windows 102. 编译器开发工具:GCC3. 编译原理教材:《编译原理》三、实验内容1. 词法分析2. 语法分析3. 语义分析4. 中间代码生成5. 代码优化6. 目标代码生成四、实验步骤1. 词法分析(1)分析输入的源代码,提取出单词序列。

(2)根据单词序列,识别出各种词法单元。

(3)输出词法单元序列。

2. 语法分析(1)根据词法单元序列,构建语法树。

(2)分析语法树,判断是否符合语法规则。

(3)输出语法分析结果。

3. 语义分析(1)分析语法树,检查语义错误。

(2)确定变量的作用域。

(3)检查类型匹配。

(4)输出语义分析结果。

4. 中间代码生成(1)根据语义分析结果,生成中间代码。

(2)中间代码通常采用三地址码的形式。

(3)输出中间代码。

5. 代码优化(1)对中间代码进行优化,提高程序运行效率。

(2)优化方法包括常数折叠、死代码删除等。

(3)输出优化后的中间代码。

6. 目标代码生成(1)根据优化后的中间代码,生成目标代码。

(2)目标代码通常采用汇编语言或机器语言。

(3)输出目标代码。

五、实验结果与分析1. 词法分析(1)输入:int a = 10;(2)输出:{<int, 关键字>, <a, 标识符>, <=, 操作符>, <10, 常量>, <;,(3)分析:成功提取出单词序列,并识别出各种词法单元。

2. 语法分析(1)输入:int a = 10;(2)输出:语法树(根据语法规则构建)(3)分析:成功构建语法树,符合语法规则。

3. 语义分析(1)输入:int a = 10;(2)输出:无错误信息(3)分析:成功进行语义分析,无语义错误。

4. 中间代码生成(1)输入:int a = 10;(2)输出:中间代码(三地址码)(3)分析:成功生成中间代码,表达式中变量和常量的类型正确。

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

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

编译原理实验词法分析实验报告一、实验目的词法分析是编译过程的第一个阶段,其主要任务是从左到右逐个字符地对源程序进行扫描,产生一个个单词符号。

本次实验的目的在于通过实践,深入理解词法分析的原理和方法,掌握如何使用程序设计语言实现词法分析器,提高对编译原理的综合应用能力。

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

三、实验原理词法分析的基本原理是根据编程语言的词法规则,将输入的字符流转换为单词符号序列。

单词符号通常包括关键字、标识符、常量、运算符和界符等。

词法分析器的实现方法有多种,常见的有状态转换图法和正则表达式法。

在本次实验中,我们采用了状态转换图法。

状态转换图是一种有向图,其中节点表示状态,有向边表示在当前状态下输入字符的可能转移。

通过定义不同的状态和转移规则,可以实现对各种单词符号的识别。

四、实验步骤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;}```通过对多个测试用例的分析,词法分析器能够正确识别出各种单词符号,实验结果符合预期。

中北编译原理实验报告

中北编译原理实验报告

一、实验目的1. 理解编译原理的基本概念,掌握编译程序的设计方法和流程。

2. 掌握编译过程中的词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等基本步骤。

3. 提高实际编程能力,培养严谨的编程思维。

二、实验环境1. 操作系统:Windows 102. 编译器:Visual Studio 20193. 编译原理实验平台:C++语言编写三、实验内容1. 词法分析器设计(1)词法分析器原理:词法分析器是编译程序中的第一个阶段,其作用是将源程序中的字符序列转换为一系列的单词符号。

本实验采用正则表达式来定义单词符号,并使用有限自动机实现词法分析。

(2)实验步骤:a. 定义单词符号:根据实验要求,设计正则表达式来定义单词符号。

b. 构建有限自动机:根据正则表达式,构建有限自动机的状态转移图。

c. 实现词法分析器:编写C++代码实现词法分析器,包括有限自动机的构建和状态转移过程。

2. 语法分析器设计(1)语法分析器原理:语法分析器是编译程序中的第二个阶段,其作用是检查源程序中的语法结构是否正确。

本实验采用递归下降分析法实现语法分析。

(2)实验步骤:a. 定义语法规则:根据实验要求,设计语法规则。

b. 构建语法分析树:根据语法规则,构建语法分析树。

c. 实现语法分析器:编写C++代码实现语法分析器,包括递归下降分析法和语法分析树的构建。

3. 语义分析器设计(1)语义分析器原理:语义分析器是编译程序中的第三个阶段,其作用是检查源程序中的语义是否正确。

本实验采用符号表来实现语义分析。

(2)实验步骤:a. 设计符号表:根据实验要求,设计符号表结构。

b. 实现语义分析器:编写C++代码实现语义分析器,包括符号表的构建和语义检查过程。

4. 中间代码生成(1)中间代码生成原理:中间代码生成是编译程序中的第四个阶段,其作用是将源程序转换为中间代码。

本实验采用三地址码作为中间代码。

(2)实验步骤:a. 设计三地址码:根据实验要求,设计三地址码格式。

编译原理实验报告

编译原理实验报告

编译原理实验报告一、实验目的编译原理是计算机科学中的重要学科,它涉及到将高级编程语言转换为计算机能够理解和执行的机器语言。

本次实验的目的是通过实际操作和编程实践,深入理解编译原理中的词法分析、语法分析、语义分析以及中间代码生成等关键环节,提高我们对编译过程的认识和编程能力。

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

此外,还使用了一些相关的编译工具和调试工具,如 GDB 等。

三、实验内容(一)词法分析器的实现词法分析是编译过程的第一步,其任务是将输入的源程序分解为一个个单词符号。

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

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

然后,根据这些类别设计了相应的状态转换图,并将其转换为代码实现。

在实现过程中,使用了正则表达式来匹配输入字符串中的单词符号。

对于标识符和常量等需要进一步处理的单词符号,使用了相应的规则进行解析和转换。

(二)语法分析器的实现语法分析是编译过程的核心环节之一,其任务是根据给定的语法规则,分析输入的单词符号序列是否符合语法结构。

在本次实验中,我们使用了递归下降的语法分析方法。

首先,根据实验要求定义了语法规则,并将其转换为相应的递归函数。

在递归函数中,通过对输入单词符号的判断和处理,逐步分析语法结构。

为了处理语法错误,在分析过程中添加了错误检测和处理机制。

当遇到不符合语法规则的输入时,能够输出相应的错误信息,并尝试进行恢复。

(三)语义分析及中间代码生成语义分析的目的是对语法分析得到的语法树进行语义检查和语义处理,生成中间代码。

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

在语义分析过程中,对变量的定义和使用、表达式的计算、控制流语句等进行了语义检查和处理。

对于符合语义规则的语法结构,生成相应的三地址码指令。

四、实验步骤(一)词法分析器的实现步骤1、定义单词符号的类别和对应的正则表达式。

编译原理语义分析实验报告

编译原理语义分析实验报告

实验3 语义分析实验报告一、实验目的二、通过上机实习, 加深对语法制导翻译原理的理解, 掌握将语法分析所识别的语法成分变换为中间代码的语义翻译方法。

三、实验要求四、采用递归下降语法制导翻译法, 对算术表达式、赋值语句进行语义分析并生成四元式序列。

五、算法思想1.设置语义过程。

(1)emit(char *result,char *ag1,char *op,char *ag2)该函数的功能是生成一个三地址语句送到四元式表中。

四元式表的结构如下:struct{ char result[8];char ag1[8];char op[8];char ag2[8];}quad[20];(2) char *newtemp()该函数回送一个新的临时变量名, 临时变量名产生的顺序为T1, T2, …char *newtemp(void){ char *p;char m[8];p=(char *)malloc(8);k++;itoa(k,m,10);strcpy(p+1,m);p[0]=’t’;return(p);}六、 2.函数lrparser 在原来语法分析的基础上插入相应的语义动作: 将输入串翻译成四元式序列。

在实验中我们只对表达式、赋值语句进行翻译。

源程序代码:#include<stdio.h>#include<string.h>#include<iostream.h>#include<stdlib.h>struct{char result[12];char ag1[12];char op[12];char ag2[12];}quad;char prog[80],token[12];char ch;int syn,p,m=0,n,sum=0,kk; //p是缓冲区prog的指针, m是token的指针char *rwtab[6]={"begin","if","then","while","do","end"};void scaner();char *factor(void);char *term(void);char *expression(void);int yucu();void emit(char *result,char *ag1,char *op,char *ag2);char *newtemp();int statement();int k=0;void emit(char *result,char *ag1,char *op,char *ag2){strcpy(quad.result,result);strcpy(quad.ag1,ag1);strcpy(quad.op,op);strcpy(quad.ag2,ag2);cout<<quad.result<<"="<<quad.ag1<<quad.op<<quad.ag2<<endl;}char *newtemp(){char *p;char m[12];p=(char *)malloc(12);k++;itoa(k,m,10);strcpy(p+1,m);p[0]='t';return (p);}void scaner(){for(n=0;n<8;n++) token[n]=NULL;ch=prog[p++];while(ch==' '){ch=prog[p];p++;}if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')){m=0;while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')){token[m++]=ch;ch=prog[p++];}token[m++]='\0';p--;syn=10;for(n=0;n<6;n++)if(strcmp(token,rwtab[n])==0){syn=n+1;break;}}else if((ch>='0'&&ch<='9')){{sum=0;while((ch>='0'&&ch<='9')){sum=sum*10+ch-'0';ch=prog[p++];}}p--;syn=11;if(sum>32767)syn=-1;}else switch(ch){case'<':m=0;token[m++]=ch;ch=prog[p++];if(ch=='>'){syn=21;token[m++]=ch;}else if(ch=='='){syn=22;token[m++]=ch;}else{syn=23;p--;}break;case'>':m=0;token[m++]=ch;ch=prog[p++];if(ch=='='){syn=24;token[m++]=ch;}else{syn=20;p--;}break;case':':m=0;token[m++]=ch;ch=prog[p++];if(ch=='='){syn=18;token[m++]=ch;}else{syn=17;p--;}break;case'*':syn=13;token[0]=ch;break; case'/':syn=14;token[0]=ch;break; case'+':syn=15;token[0]=ch;break; case'-':syn=16;token[0]=ch;break; case'=':syn=25;token[0]=ch;break; case';':syn=26;token[0]=ch;break; case'(':syn=27;token[0]=ch;break; case')':syn=28;token[0]=ch;break; case'#':syn=0;token[0]=ch;break; default: syn=-1;break;}}int lrparser(){//cout<<"调用lrparser"<<endl;int schain=0;kk=0;if(syn==1){scaner();schain=yucu();if(syn==6){scaner();if(syn==0 && (kk==0))cout<<"success!"<<endl;}else{if(kk!=1)cout<<"缺end!"<<endl;kk=1;}}else{cout<<"缺begin!"<<endl;kk=1;}return(schain);}int yucu(){// cout<<"调用yucu"<<endl;int schain=0;schain=statement();while(syn==26){scaner();schain=statement();}return(schain);}int statement(){//cout<<"调用statement"<<endl;char *eplace,*tt;eplace=(char *)malloc(12);tt=(char *)malloc(12);int schain=0;switch(syn){case 10:strcpy(tt,token);scaner();if(syn==18){scaner();strcpy(eplace,expression());emit(tt,eplace,"","");schain=0;}else{cout<<"缺少赋值符!"<<endl;kk=1;}return(schain);break;}return(schain);}char *expression(void){char *tp,*ep2,*eplace,*tt;tp=(char *)malloc(12);ep2=(char *)malloc(12);eplace=(char *)malloc(12);tt =(char *)malloc(12);strcpy(eplace,term ()); //调用term分析产生表达式计算的第一项eplacewhile((syn==15)||(syn==16)){if(syn==15)strcpy(tt,"+");else strcpy(tt,"-");scaner();strcpy(ep2,term()); //调用term分析产生表达式计算的第二项ep2strcpy(tp,newtemp()); //调用newtemp产生临时变量tp存储计算结果emit(tp,eplace,tt,ep2); //生成四元式送入四元式表strcpy(eplace,tp);}return(eplace);}char *term(void){// cout<<"调用term"<<endl;char *tp,*ep2,*eplace,*tt;tp=(char *)malloc(12);ep2=(char *)malloc(12);eplace=(char *)malloc(12);tt=(char *)malloc(12);strcpy(eplace,factor());while((syn==13)||(syn==14)){if(syn==13)strcpy(tt,"*");else strcpy(tt,"/");scaner();strcpy(ep2,factor()); //调用factor分析产生表达式计算的第二项ep2strcpy(tp,newtemp()); //调用newtemp产生临时变量tp存储计算结果emit(tp,eplace,tt,ep2); //生成四元式送入四元式表strcpy(eplace,tp);}return(eplace);}char *factor(void){char *fplace;fplace=(char *)malloc(12);strcpy(fplace,"");if(syn==10){strcpy(fplace,token); //将标识符token的值赋给fplacescaner();}else if(syn==11){itoa(sum,fplace,10);scaner();}else if(syn==27){scaner();fplace=expression(); //调用expression分析返回表达式的值if(syn==28)scaner();else{cout<<"缺)错误!"<<endl;kk=1;}}else{cout<<"缺(错误!"<<endl;kk=1;}return(fplace);}void main(){p=0;cout<<"**********语义分析程序**********"<<endl;cout<<"Please input string:"<<endl;do{cin.get(ch);prog[p++]=ch;}while(ch!='#');p=0;scaner();lrparser();}七、结果验证1、给定源程序begin a:=2+3*4; x:=(a+b)/c end#输出结果2、源程序begin a:=9; x:=2*3-1; b:=(a+x)/2 end#输出结果八、收获(体会)与建议通过此次实验, 让我了解到如何设计、编制并调试语义分析程序, 加深了对语法制导翻译原理的理解, 掌握了将语法分析所识别的语法成分变换为中间代码的语义翻译方法。

实验报告编译实验

实验报告编译实验

一、实验目的1. 理解编译原理的基本概念和过程。

2. 掌握编译器的基本组成和编译流程。

3. 学会使用编译器对源代码进行编译,并分析编译结果。

二、实验环境1. 操作系统:Windows 102. 编译器:GCC (GNU Compiler Collection)3. 开发工具:Visual Studio Code三、实验内容1. 编译器的基本组成和编译流程2. 编译器的使用3. 编译结果分析四、实验步骤1. 编译器的基本组成和编译流程(1)词法分析:将源代码分解成一个个的单词,如标识符、关键字、运算符等。

(2)语法分析:将单词序列转换成语法树,验证源代码是否符合语法规则。

(3)语义分析:检查语法树,确保源代码在语义上是正确的。

(4)中间代码生成:将语法树转换成中间代码,如三地址代码。

(5)代码优化:对中间代码进行优化,提高程序运行效率。

(6)目标代码生成:将优化后的中间代码转换成目标代码,如汇编代码。

(7)代码生成:将目标代码转换成可执行文件。

2. 编译器的使用(1)编写源代码:使用Visual Studio Code编写C语言源代码。

(2)编译源代码:在命令行中输入gcc -o 程序名源文件名.c,编译源代码。

(3)运行程序:在命令行中输入程序名,运行编译后的程序。

3. 编译结果分析(1)词法分析:编译器将源代码中的单词进行分解,如以下代码:```cint main() {int a = 1;return a;}```编译器将分解为以下单词:- int- main- (- )- {- int- a- =- 1- ;- return- a- ;- }- }(2)语法分析:编译器将单词序列转换成语法树,验证源代码是否符合语法规则。

(3)语义分析:编译器检查语法树,确保源代码在语义上是正确的。

(4)中间代码生成:编译器将语法树转换成中间代码,如以下三地址代码:```t1 = 1a = t1t2 = areturn t2```(5)代码优化:编译器对中间代码进行优化,如以下优化后的三地址代码:```a = 1return a```(6)目标代码生成:编译器将优化后的中间代码转换成汇编代码。

大学编译原理实验报告

大学编译原理实验报告

一、实验名称编译原理实验二、实验目的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. 本次实验让我认识到编译原理在软件开发中的重要性,以及编译器在代码生成和优化方面的作用。

编译原理实验教案

编译原理实验教案

一、实验目的与要求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. 实验目的(1) 理解编译原理的基本概念和流程;(2) 掌握编译器的基本组成部分和实现方法;(3) 熟悉编程语言和编译工具的使用;(4) 培养学生动手能力和团队协作精神。

2. 实验要求(1) 了解编译原理的基本原理和编译过程;(2) 掌握至少一种编程语言的基本语法;二、实验环境与工具1. 实验环境(1) 计算机一台;(2) 操作系统:Windows/Linux/MacOS;(3) 网络环境:可访问互联网。

2. 实验工具(1) 编程语言:C/C++/Java/Python等;(2) 编译器:GCC/G++/Java Compiler/Python Interpreter等;(3) 编辑器:Visual Studio/Eclipse/Sublime Text/Vim等;(4) 调试工具:GDB/JDB/Python Debugger等。

三、实验内容与步骤1. 实验内容(1) 词法分析:实现一个简单的词法分析器,识别基本词法单元;(2) 语法分析:实现一个简单的语法分析器,分析给定的语法规则;(3) 语义分析:实现一个简单的语义分析器,检查程序中的语义错误;(4) 中间代码:根据语法分析结果中间代码;(5) 目标代码:根据中间代码目标代码。

2. 实验步骤(1) 选择合适的编程语言和编译工具;(2) 设计词法分析器、语法分析器、语义分析器、中间代码器和目标代码器的结构;(3) 编写各个阶段的代码,并进行调试;(4) 分析实验结果,优化和改进算法;四、实验注意事项1. 严格按照实验要求和步骤进行,确保实验的顺利进行;2. 遇到问题时,先自行查找资料和尝试解决,再寻求助教或老师的帮助;3. 实验过程中,要注意代码的规范性和可读性,便于后续的调试和维护;4. 实验报告要详细记录实验过程、结果和收获,以及遇到的问题和解决方法。

五、实验评价与成绩评定1. 实验评价(1) 词法分析器的功能和性能;(2) 语法分析器的功能和性能;(3) 语义分析器的功能和性能;(4) 中间代码器的功能和性能;(5) 目标代码器的功能和性能。

编译原理实验报告小结

编译原理实验报告小结

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

编译原理实验报告

编译原理实验报告

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

编译原理实验报告转换(3篇)

编译原理实验报告转换(3篇)

第1篇一、实验目的1. 理解编译原理的基本概念和词法分析器的作用。

2. 掌握词法分析器的实现方法,包括状态转换图的设计、状态表的创建和代码的编写。

3. 通过实验加深对编译原理中词法分析阶段的理解,提高编程能力。

二、实验内容本次实验要求设计并实现一个简单的词法分析器,对给定的源代码进行词法分析,输出对应的词法单元。

三、实验步骤1. 设计状态转换图根据实验要求,首先需要设计一个状态转换图,用于描述词法分析器在分析过程中状态的变化。

状态转换图包括以下部分:- 状态:表示词法分析器在分析过程中的不同状态。

- 输入符号:表示词法分析器可以接收的字符。

- 转换:表示在当前状态下,输入特定的字符后词法分析器应该转换到哪个状态。

- 标记:表示在当前状态下输入特定字符后词法分析器需要输出的词法单元。

2. 创建状态表根据状态转换图,创建状态表。

状态表用于指导词法分析器在分析过程中的状态转换。

状态表包括以下部分:- 状态:表示词法分析器当前所处的状态。

- 输入符号:表示词法分析器可以接收的字符。

- 下一个状态:表示在当前状态下,输入特定字符后词法分析器应该转换到的状态。

- 标记:表示在当前状态下输入特定字符后词法分析器需要输出的词法单元。

3. 编写代码根据状态表,编写词法分析器的代码。

代码主要包含以下部分:- 初始化:初始化词法分析器,包括状态设置、缓冲区设置等。

- 分析:对源代码进行逐字符分析,根据状态表进行状态转换,并输出对应的词法单元。

- 输出:将分析得到的词法单元输出到指定位置。

4. 测试与调试编写测试用例,对词法分析器进行测试。

在测试过程中,根据测试结果对代码进行调试,确保词法分析器能够正确地分析源代码。

四、实验结果与分析1. 实验结果本次实验成功设计并实现了一个简单的词法分析器,能够对给定的源代码进行词法分析,输出对应的词法单元。

2. 实验分析在本次实验中,我们通过设计状态转换图和状态表,实现了词法分析器的核心功能。

华工编译原理实验报告

华工编译原理实验报告

一、实验目的通过本次实验,加深对编译原理中语法分析部分的理解,掌握递归下降分析法和LR(1)分析法的原理和实现方法,并能够运用所学知识对简单的文法进行语法分析。

二、实验内容本次实验主要分为两个部分:1. 递归下降分析法- 实验要求:针对给定的文法,编写递归下降分析程序,实现对输入的字符串进行语法分析。

- 文法示例:```S -> A BA -> a A | εB -> b B | ε```- 实现过程:- 定义文法的非终结符号、终结符号和开始符号。

- 设计递归下降分析函数,按照文法的产生式进行递归调用。

- 处理输入字符串,调用递归下降分析函数进行语法分析。

2. LR(1)分析法- 实验要求:针对给定的文法,编写LR(1)分析程序,实现对输入的字符串进行语法分析。

- 文法示例:```S -> A BA -> a A | εB -> b B | ε```- 实现过程:- 求解文法的 FIRST 集和 FOLLOW 集。

- 构建LR(1)分析表,包括状态转移函数、接受状态和错误处理函数。

- 设计LR(1)分析程序,根据分析表进行状态转移和语法分析。

三、实验步骤1. 递归下降分析法- 步骤一:定义文法的非终结符号、终结符号和开始符号。

- 步骤二:设计递归下降分析函数,按照文法的产生式进行递归调用。

- 步骤三:编写主函数,读取输入字符串,调用递归下降分析函数进行语法分析。

2. LR(1)分析法- 步骤一:求解文法的 FIRST 集和 FOLLOW 集。

- 步骤二:构建LR(1)分析表,包括状态转移函数、接受状态和错误处理函数。

- 步骤三:设计LR(1)分析程序,根据分析表进行状态转移和语法分析。

四、实验结果1. 递归下降分析法- 对于输入字符串 "aaabbb",程序能够正确分析并输出分析结果。

2. LR(1)分析法- 对于输入字符串 "aaabbb",程序能够正确分析并输出分析结果。

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

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

编译原理实验词法分析实验报告一、实验目的词法分析是编译过程中的第一个阶段,其主要任务是从输入的源程序中识别出具有独立意义的单词符号,并将其转换为内部编码形式。

本次实验的目的是通过设计和实现一个简单的词法分析程序,深入理解词法分析的基本原理和方法,提高对编程语言语法结构的认识和编程能力。

二、实验原理词法分析的基本原理是根据编程语言的词法规则,使用有限自动机或正则表达式等技术来识别单词符号。

在本次实验中,我们采用了状态转换图的方法来设计词法分析器。

状态转换图是一种用于描述有限自动机的图形表示方法,它由状态节点和有向边组成。

每个状态节点表示自动机的一个状态,有向边表示状态之间的转换条件。

当输入字符与当前状态的转换条件匹配时,自动机将从当前状态转换到下一个状态。

当到达一个终态时,表示识别出了一个单词符号。

三、实验环境本次实验使用了 Python 编程语言,并在 PyCharm 集成开发环境中进行开发和调试。

四、实验内容1、定义单词符号的种类和编码关键字:如`if`、`else`、`while` 等标识符:由字母、数字和下划线组成,且以字母或下划线开头常数:包括整数和浮点数运算符:如`+`、``、``、`/`等分隔符:如`(){},;`等2、设计状态转换图根据单词符号的定义,设计了相应的状态转换图,用于识别不同类型的单词符号。

例如,对于标识符的识别,从起始状态开始,当输入字符为字母或下划线时,进入标识符状态,继续输入字母、数字或下划线,直到遇到非标识符字符为止,此时到达终态,识别出一个标识符。

3、实现词法分析程序使用 Python 语言实现了基于状态转换图的词法分析程序。

程序首先读取输入的源程序文本,然后逐个字符进行处理,根据当前状态和输入字符进行状态转换,当到达终态时,输出识别出的单词符号及其编码。

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. 理解编译原理的基本概念和编译过程。

2. 掌握编译器各个阶段的功能和实现方法。

3. 通过实际操作,加深对编译原理的理解和应用。

二、实验环境1. 操作系统:Windows 102. 编译器:C++编译器3. 开发环境:Visual Studio三、实验内容1. 词法分析2. 语法分析3. 语义分析4. 中间代码生成5. 代码优化6. 目标代码生成四、实验步骤1. 词法分析(1)设计词法分析器:根据实验要求,设计一个词法分析器,能够将源代码中的字符序列转换成一个个词法符号。

(2)实现词法分析器:使用C++编写词法分析器代码,实现字符序列到词法符号的转换。

(3)测试词法分析器:编写测试用例,验证词法分析器的正确性。

2. 语法分析(1)设计语法分析器:根据实验要求,设计一个语法分析器,能够识别源代码中的语法结构。

(2)实现语法分析器:使用C++编写语法分析器代码,实现语法结构的识别。

(3)测试语法分析器:编写测试用例,验证语法分析器的正确性。

3. 语义分析(1)设计语义分析器:根据实验要求,设计一个语义分析器,能够对源代码中的语义进行验证。

(2)实现语义分析器:使用C++编写语义分析器代码,实现语义验证。

(3)测试语义分析器:编写测试用例,验证语义分析器的正确性。

4. 中间代码生成(1)设计中间代码生成器:根据实验要求,设计一个中间代码生成器,能够将源代码转换成中间代码。

(2)实现中间代码生成器:使用C++编写中间代码生成器代码,实现源代码到中间代码的转换。

(3)测试中间代码生成器:编写测试用例,验证中间代码生成器的正确性。

5. 代码优化(1)设计代码优化器:根据实验要求,设计一个代码优化器,能够对中间代码进行优化。

(2)实现代码优化器:使用C++编写代码优化器代码,实现中间代码的优化。

(3)测试代码优化器:编写测试用例,验证代码优化器的正确性。

6. 目标代码生成(1)设计目标代码生成器:根据实验要求,设计一个目标代码生成器,能够将优化后的中间代码转换成目标代码。

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

编译原理实验报告姓名:陈旺学号: 20134622 学院:计算机信息与工程学院专业班级:计算机科学与技术2班实验一词法分析一、实验目的编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。

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

二、实验题目如源程序为C语言。

输入如下一段:main(){int a=-5,b=4,j;if(a>=b)j=a-b;else j=b-a;}要求输出如下:(2,”main”)(5,”(”)(5,”)”)(5,”{”)(1,”int”)(2,”a”)(4,”=”)(3,”-5”)(5,”,”)(2,”b”)(4,”=”)(3,”4”)(5,”,”)(2,”j”)(5,”;”)(1,”if”)(5,”(”)(2,”a”)(4,”>=”)(2,”b”)(5,”)”)(2,”j”)(4,”=”)(2,”a”)(4,”-”)(2,”b”)(5,”;”)(1,”else”)(2,”j”)(4,”=”)(2,”b”)(4,”-”)(2,”a”)(5,”;”)(5,”}”)三、实验理论依据(一)识别各种单词符号1、程序语言的单词符号一般分为五种:(1)关键字(保留字/ 基本字)if 、while 、begin…(2)标识符:常量名、变量名…(3)常数:34 、56.78 、true 、…a‟、…(4)运算符:+ 、- 、* 、/ 、〈、and 、or 、….(5)界限符:,;(){ } /*…2、识别单词:掌握单词的构成规则很重要(1)标识符的识别:字母| 下划线+( 字母/ 数字/ 下划线)(2)关键字的识别:与标识符相同,最后查表(3)常数的识别(4)界符和算符的识别3、大多数程序设计语言的单词符号都可以用转换图来识别,如图1-1图1-14、词法分析器输出的单词符号常常表示为二元式:(单词种别,单词符号的属性值)(1)单词种别通常用整数编码,如1 代表关键字,2 代表标识符等(2)关键字可视其全体为一种,也可以一字一种。

采用一字一种得分法实际处理起来较为方便。

(3)标识符一般统归为一种(4)常数按类型(整、实、布尔等)分种(5)运算符可采用一符一种的方法。

(6)界符一般一符一种的分法。

(二)超前搜索方法1、词法分析时,常常会用到超前搜索方法。

如当前待分析字符串为“a>+”,当前字符为“>”,此时,分析器倒底是将其分析为大于关系运算符还是大于等于关系运算符呢?显然,只有知道下一个字符是什么才能下结论。

于是分析器读入下一个字符‟+‟,这时可知应将‟>‟解释为大于运算符。

但此时,超前读了一个字符‟+‟,所以要回退一个字符,词法分析器才能正常运行。

又比如:…+‟分析为正号还是加法符号(三)预处理预处理工作包括对空白符、跳格符、回车符和换行符等编辑性字符的处理,及删除注解等。

由一个预处理子程序来完成。

四、词法分析器的设计1、设计方法:(1)写出该语言的词法规则。

(2)把词法规则转换为相应的状态转换图。

(3)把各转换图的初态连在一起,构成识别该语言的自动机(4)设计扫描器2、把扫描器作为语法分析的一个过程,当语法分析需要一个单词时,就调用扫描器。

五、源程序#include<stdio.h>#include<math.h>#include<ctype.h>#include<string.h>#include<conio.h>FILE *fp;char cbuffer;char *key[10]={"if","else","for","while","return","break","continue","int","char","then"}; //newint atype,id=4;int search(char searchchar[ ],int wordtype) /*判断单词是保留字还是标识符*/ {int i=0;int p;switch (wordtype){case 1:for (i=0;i<=9;i++){if (strcmp(key[i],searchchar)==0){ p=i+1; break; } /*是保留字则p为非0且不重复的整数*/ else p=0; /*不是保留字则用于返回的p=0*/}return(p);}}char digitprocess(char buffer) //判断正数小数点{int i=-1;char digittp[20];int a=0;while ((isdigit(buffer))||buffer=='.') //new{if(buffer=='.'){a=a+1;}digittp[++i]=buffer;buffer=fgetc(fp);}if(a>1){digittp[i+1]='\0';printf("(%s ,3,error)\n",digittp);}else{digittp[i+1]='\0';printf("(%s,3)\n",digittp);id=3;}return(buffer);}char alphaprocess(char buffer){ int atype; /*保留字数组中的位置*/int i=-1;char alphatp[20];while ((isalpha(buffer))||(isdigit(buffer))||buffer=='_'){alphatp[++i]=buffer;buffer=fgetc(fp); //new} /*读一个完整的单词放入alphatp数组中*/alphatp[i+1]='\0';atype=search(alphatp,1);/*对此单词调用search函数判断类型*/if(atype!=0){ printf("%s, (1,%d)\n",alphatp,atype-1); id=1; } else{ printf("(%s ,2)\n",alphatp); id=2; }return(buffer); //new}char otherprocess(char buffer){char ch[20];ch[0]=buffer;ch[1]='\0';if(ch[0]==','||ch[0]==';'||ch[0]=='{'||ch[0]=='}'||ch[0]=='('||ch[0]==')') { printf("(%s ,5)\n",ch);buffer=fgetc(fp);id=4;return(buffer);}//判断*=,/=if(ch[0]=='*'||ch[0]=='/'){buffer=fgetc(fp);if(buffer=='='){ch[1]=buffer;ch[2]='\0';printf("(%s ,4)\n",ch);buffer=fgetc(fp);return(buffer);}else {printf("(%s ,4)\n",ch);id=4;return(buffer);}}//判断与或if(ch[0]=='|'||ch[0]=='&'){buffer=fgetc(fp);if(buffer==ch[0]){ ch[1]=buffer;ch[2]='\0';printf("(%s ,4)\n",ch);buffer=fgetc(fp);return(buffer);}else{ ch[1]='\0';printf("(%s ,4,)\n",ch);id=4;return(buffer);}}//判断==,!=,<=,>=if(ch[0]=='='||ch[0]=='!'||ch[0]=='<'||ch[0]=='>'||ch[0]==':'){ buffer=fgetc(fp);if(buffer=='='){ ch[1]=buffer;ch[2]='\0';printf("(%s ,4)\n",ch);}else{ printf("(%s ,4)\n",ch);id=4;return(buffer);}buffer=fgetc(fp);id=4;return(buffer);}//在当前符号以前是运算符,则此时为正负号,负数浮点数的阅读,点的个数的判断if(ch[0]=='+'||ch[0]=='-'){ if(id==4){int i=0;char numpoint[20];int a=0;numpoint[0]=ch[0];buffer=fgetc(fp);while ((isdigit(buffer))||buffer=='.'){ if(buffer=='.'){a=a+1;}numpoint[++i]=buffer;buffer=fgetc(fp);}if(a>1){numpoint[i+1]='\0';printf("(%s ,3,error)\n",numpoint);}else{numpoint[i+1]='\0';printf("(%s,3)\n",numpoint);id=3;}return(buffer);}else if(buffer=='='){ //判断+=,-= ch[1]=buffer;ch[2]='\0';printf("(%s ,4)\n",ch);buffer=fgetc(fp);return(buffer);}else if(buffer==ch[0]){ //判断++,-- ch[1]=buffer;ch[2]='\0';printf("(%s ,4)\n",ch);buffer=fgetc(fp);return(buffer);}else{ ch[1]='\0';printf("(%s ,4)\n",ch);buffer=fgetc(fp);id=4;return(buffer);}}return 0;}void main(){if ((fp=fopen("example.txt","r"))==NULL) /*只读方式打开一个文件*/ printf("error");else{cbuffer = fgetc(fp); /*fgetc( )函数:从磁盘文件读取一个字符*/while (cbuffer!=EOF){if(cbuffer==' '||cbuffer=='\n') /*掠过空格和回车符*/cbuffer=fgetc(fp);elseif(isalpha(cbuffer))cbuffer=alphaprocess(cbuffer);elseif (isdigit(cbuffer))cbuffer=digitprocess(cbuffer);else cbuffer=otherprocess(cbuffer);}}}Example.txtmain(){int a=-5,b=4,i,j;if(a>=b)j=a-b;else j=b-a;a*=b;a/=b;a=a/b;a-=b;a!=5;i++;j--;i=3.5;i=-3.5;||;|&;then x:=y;}六、实验结果实验二 LL (1)分析法一、实验目的:根据某一文法编制调试LL(1)分析程序,以便对任意输入的符号串进行分析。

相关文档
最新文档