当前位置:文档之家› 哈工大 威海 编译原理 实验二 语法分析

哈工大 威海 编译原理 实验二 语法分析

哈尔滨工业大学(威海)计算机学院

编译原理实验报告

姓名院系计算机学院学号

任课教师指导教师闫健恩

实验地点宋健二楼机房实验时间

实验名称实验二LR语法分析技术

同组人无

预习报告(对实验主要内容的认识) 得分

(1)给出主要数据结构:分析栈、符号表、语法分析树;

(2)将扫描器作为一个子程序,每次调用返回一个TOKEN;

(3)程序界面:表达式输入、语法分析树的表示结果(文件或者图形方式);

实验内容(问题,思路,程序,结果)得分

(1)开发环境:vs2010

(2)输入:在运行打开的软件下(win32格式),输入相应的代码(即要进行词法分析的字符串)

(3)输出:在输入字符串后,按回车键后,既可以得到相应的词法分析的结果

(4)在相应的运行程序的文件夹中生成一个txt文件,用来存储生成的Token 链表

(5)系统功能:

1、词法分析:将输入的字符串进行单词级别的分析并且生成且输

出Token表

2、语法生成器:可以将语法生成相应的状态,在这个实验中共有

语法如下:

3、CLOSURE生成

4、LR项集族的生成

6、Goto表的生成

7、Scaner词法分析器将Token表输出

8、语法分析器对Token表的分析,得出结果

(2)开发平台(操作系统、设计语言):

1、操作系统:windows 7

2、设计语言:c++

3、编译器:vs2010

(3)设计方案;

1)主数据流图;

开始

读取构造的文法(grammar.txt)

构造item.txt 集族

构造action表,写入文档

进行语法的匹配(自底向上RL(1))

匹配时出现错误?

查找action表继续进行匹配如果代码分析还未完成,继续

结束Y

N

2)主要数据结构:符号表、TOKEN串表等。//符号表

class symTable

{

private:

char* symName;

char* symStyle;

int symLength;

public: symTable *next;

public:

symTable();

symTable(char* sysName,char* sysStyle,int sysLength);

symTable(symTable &s);

char* getName();

char* getStyle();

int getLength();

void symAdd(symTable* symFirst);

void print();

};

char G[30][30]; //use a matrix to store grammar G

//存放文法,用来分析作为输入

int length[30]; //length use to store each formula's length

int number = 0;

bool tempofinput[150]; //buffer of input

//输入???

char str_vn[30]; //put all vn into it

int size_vn = 0;

char str_vt[150]; //put all vt into it

int size_vt = 0;

bool first_vn[30][150];

char buffer[50];

//用来存放生成CLOSURE(I)时需要的first_set 也用来读入用户的输入串^_^

int bsize = 0;

struct thri{

int beg;

int nex;

char ch;

};

thri trans[200];

int size_trans = 0;

//定义项目集的形式

struct proj{

int formula_numb;

int part;

char expc;

};

/*项目集*/

proj items[200][200];

int Ccount = 0;

int size_item[200];

/*状态转换表*/

struct action{

char ch;

int nxt_sta;

};

action action_table[200][200]; int size_act_table[200];

ifstream G_ifile;

ifstream input_ifile;

ofstream items_ofile;

ofstream act_ofile;

(4)具体设计过程(包括主控程序、各个功能模块的具体实现)。

1、主控程序

简介:主控制流程主要包括下面的几部分:

(1)词法分析器的子函数修改

(2)对于输入grammar,输出集族

(3)输入集族,可以构造出相应的action表

(4)根据得到的action表生成相应的语法分析策略

2、对于词法的分析

简介:主要实现和在实验一中的功能相同,只是将现在的实现包装到一个

函数里面,这样就是为了对代码进行重复的快捷的利用,只是需要将得到

的程序代码作为输入,词法分析函数就会自动的生成相应的token表和相

应的符号表。

3、对于item生成

简介:自己通过分析课本上的实验伪代码,以及yacc文法代码生成工具

的研究,编写相依的item集族的生成工具,生成的I状态共有105中,

具体的实现以及生成的状态在文档中(见于:item.txt)

4、对于action生成(action+goto)

简介:通过生成的item表,构建一个action生成工具就可以得到相应的

action表格,这个表格可以进行重复的利用(只要写到函数中即可,不

需要每次都进行读入内存,然后在进行生成)

5、语法分析分析

根据LR的自底向上的方法进行语句与文法(在action中描述)进行匹

配,若匹配成功,这该语句正确,分析下一条语句,否者错误提示输出。

实验结论得分

本次试验我学习到了一下内容:

(1)编写了一个文法分析器,参照yacc可以输入文法(按照相应的格式),然后生成一个item项用来存放规范LR(0)项集族。输入的相应的格式在实验内容中已经给出。(相应的生成的item表格在上文中已经给出,并且在工程的文档中也有给处)(2)编写了一个Action表以及Goto表的生成程序(一个程序生成两个表格归并成为一个),并且放到相应的txt中,可以适用于任何其他想要使用这个文法的语法分析器。(相应的生成的Action表格在上文中已经给出,并且在工程的文档中也有给处)(3)综合了第一个实验的词法分析器,并且修正了词法分析器中一些鲁棒性不是很好的地方。

(4)所有函数的算法思想以及实现方案,都可以在相应的源码的注释处找到。

教师评价总分实际得分

哈工大编译原理

哈工大编译原理基本原理 1. 什么是编译原理? 编译原理(Compiler Design)是计算机科学中的一个重要分支,研究的是将高级语言程序翻译成机器语言程序的过程和方法。编译原理包括语法分析、语义分析、中间代码生成、代码优化和目标代码生成等阶段。 2. 编译器的基本工作流程 编译器通常由以下几个阶段组成: 2.1 词法分析 词法分析阶段将源代码划分为一个个的单词(Token),并进行分类。例如,对于C语言而言,单词可以是关键字(如if、for)、标识符(如变量名)、常量(如整数、字符)等。 2.2 语法分析 语法分析阶段根据程序的上下文无关文法规则,将单词序列转换为抽象语法树(Abstract Syntax Tree,AST),以便进一步进行语义分析和中间代码生成。常用的方法有自顶向下的递归下降分析和自底向上的LR(1)分析。 2.3 语义分析 语义分析阶段主要检查源程序是否符合给定的语义规则,并对其进行语义翻译。例如,检查变量是否被声明、函数调用是否正确等。语义分析通常会生成符号表,用于记录程序中的变量、函数等信息。 2.4 中间代码生成 中间代码是一种介于源代码和目标代码之间的抽象表示形式,通常使用三地址码或四元式表示。中间代码生成阶段将抽象语法树转换为中间代码,以便进行后续的优化和目标代码生成。 2.5 代码优化 代码优化阶段对中间代码进行优化,以提高程序的执行效率和资源利用率。常见的优化技术包括常量传播、公共子表达式消除、循环展开等。 2.6 目标代码生成 目标代码生成阶段将优化后的中间代码转换为特定机器上可执行的目标代码。目标代码可以是汇编语言或机器语言,并且通常需要考虑底层硬件架构的特性和限制。

编译原理实验报告总结

学年第学期《编译原理》实验报告 学院(系):计算机科学与工程学院 班级:11303070A 学号:11303070*** 姓名:无名氏 指导教师:保密式 时间:2016 年7 月

目录 1.实验目的 (1) 2.实验内容及要求 (1) 3.实验方案设计 (1) 3.1 编译系统原理介绍 (1) 3.1.1 编译程序介绍 (2) 3.1.2 对所写编译程序的源语言的描述 (2) 3.2 词法分析程序的设计 (3) 3.3 语法分析程序设计 (4) 3.4 语义分析和中间代码生成程序的设计 (4) 4. 结果及测试分析 (4) 4.1软件运行环境及限制 (4) 4.2测试数据说明 (5) 4.3运行结果及功能说明 (5) 5.总结及心得体会 (7)

1.实验目的 根据Sample语言或者自定义的某种语言,设计该语言的编译前端。包括词法分析,语法分析、语义分析及中间代码生成部分。 2.实验内容及要求 (1)词法分析器 输入源程序,输出对应的token表,符号表和词法错误信息。按规则拼单词,并转换成二元形式;滤掉空白符,跳过注释、换行符及一些无用的符号;进行行列计数,用于指出出错的行列号,并复制出错部分;列表打印源程序;发现并定位词法错误; (2)语法分析器 输入token串,通过语法分析,寻找其中的语法错误。要求能实现Sample 语言或自定义语言中几种最常见的、基本的语法单位的分析:算术表达式、布尔表达式、赋值语句、if语句、for语句、while语句、do while语句等。 (3)语义分析和中间代码生成 输入token串,进行语义分析,修改符号表,寻找其中的语义错误,并生 成中间代码。要求能实现Sample语言或自定义语言中几种最常见的、基本的语法单位的分析:算术表达式、布尔表达式、赋值语句、if语句、for语句、while 语句、do while语句等。 实验要求:功能相对完善,有输入、输出描述,有测试数据,并介绍不足。3.实验方案设计 3.1 编译系统原理介绍 编译器逐行扫描高级语言程序源程序,编译的过程如下: (1).词法分析 识别关键字、字面量、标识符(变量名、数据名)、运算符、注释行(给人看的,一般不处理)、特殊符号(续行、语句结束、数组)等六类符号,分别归类等待处理。 (2).语法分析 一个语句看作一串记号(Token)流,由语法分析器进行处理。按照语言的文法检查判定是否是合乎语法的句子。如果是合法句子就以内部格式保存,否则报错。直至检查完整个程序。 (3).语义分析 语义分析器对各句子的语法做检查:运算符两边类型是否相兼容;该做哪些类型转换(例如,实数向整数赋值要"取整");控制转移是否到不该去的地方;是

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

《编译原理》 实验报告 班级: 学号: 姓名:

实验一词法扫描器设计 一实验目的 通过设计调试词法分析程序,实现从源程序中分出各种单词的方法;加深对课堂教学的理解;提高词法分析方法的实践能力。 二实验内容 设计一个简单的类C语言的词法扫描器。 三实验要求 (一)程序设计要求 (1)根据附录给定的文法,从输入的类C语言源程序中,识别出各个具有独立意义的单词,即关键字、标识符、常数、运算符、分隔符 五大类;文法见最后附录。 (2)提供源程序输入界面; (3)词法分析后可查看符号表和TOKEN串表; (4)保存符号表和TOKEN串表(如:文本文件); (5)遇到错误时可显示提示信息,然后跳过错误部分继续进行分析。(二)实验报告撰写要求 (1)系统功能(包括各个子功能模块的功能说明); (2)开发平台(操作系统、设计语言); (3)设计方案;

1)主数据流图; 2)主要子程序的流程框图(若有必要); 3)模块结构图; 4)主要数据结构:符号表、TOKEN串表等。 (4)具体设计过程(包括主控程序、各个功能模块的具体实现)。 1.系统功能: 根据附录给定的文法,从输入的类C语言源程序中,识别出各个具有独立意义的单词,即关键字、标识符、常数、运算符、分隔符五大类。然后输出本源程序的符号表显示在dos界面和存放在文本文件中。本程序以如下源程序(语法分析的例子)示范: 源程序; 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 3.设计方案: (1)主流程图:

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

一、目的(本次实验所涉及并要求掌握的知识点) 通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。 编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续显示) 二、实验内容与设计思想(设计思路、主要数据结构、主要代码结构、主要代码段分析等) 程序输入/输出示例: 如源程序为C语言。输入如下一段: main() { int a,b; a = 10; b = a + 20; } 要求输出如右图。

要求: 识别保留字:if、int、for、while、do、return、break、continue; 单词种别码为1。 其他的都识别为标识符;单词种别码为2。 常数为无符号整形数;单词种别码为3。 运算符包括:+、-、*、/、=、、<、=、<=、!= ; 单词种别码为4。 分隔符包括:,、;、{、}、(、);单词种别码为5。 三、实验使用环境(本次实验所使用的平台和相关软件) 平台:WindowsXP SP3 软件:MyElicpse 四、实验步骤和调试过程(实验步骤、测试数据设计、测试结果分析)1)定义常量及变量:

private JTextArea ta1; private JTextArea ta2; private JButton jb=new JButton("词法分析"); private JButton jb1=new JButton("清空文本区"); private JLabel jl1=new JLabel("输入源代码:"); private JLabel jl2=new JLabel("分析结果:"); static int m=0; //标识字符位置标记 static String str1 = new String(); String blz[]={"int","return","break","while","for","do","continue","if","else"}; 2)主要实现的函数: public void actionPerformed(ActionEvent e) { if(e.getSource()==jb1) { int a=JOptionPane.showConfirmDialog(null, "确定清空吗?","提示! ",JOptionPane.YES_NO_OPTION); if( a==JOptionPane.YES_OPTION) { ta1.setText(""); ta2.setText(""); } } if(e.getSource()==jb) { String a=ta1.getText(); //把输入的软代码赋值给字符串变量a char[] b=new char[a.length()]; //把a中的字符一个一个放入字符数组b中 for(int i=0;i

编译原理词法分析和语法分析

词法分析 一、实验目的 设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。 二、实验要求 2.1 待分析的简单的词法 (1)关键字: begin if then while do end 所有的关键字都是小写。 (2)运算符和界符 := + - * / < <= <> > >= = ; ( ) # (3)其他单词是标识符(ID)和整型常数(SUM),通过以下正规式定义: ID = letter (letter | digit)* NUM = digit digit* (4)空格有空白、制表符和换行符组成。空格一般用来分隔ID、SUM、运算符、界符和关键字,词法分析阶段通常被忽略。 2.2 各种单词符号对应的种别码: 表2.1 各种单词符号对应的种别码 2.3 词法分析程序的功能: 输入:所给文法的源程序字符串。 输出:二元组(syn,token或sum)构成的序列。 其中:syn为单词种别码; token为存放的单词自身字符串; sum为整型常数。 例如:对源程序begin x:=9: if x>9 then x:=2*x+1/3; end #的源文件,经过词法分析后输出如下序列: (1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)…… 三、词法分析程序的算法思想: 算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。 3.1 主程序示意图:

主程序示意图如图3-1所示。其中初始包括以下两个方面: ⑴关键字表的初值。 关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。如能查到匹配的单词,则该单词为关键字,否则为一般标识符。关键字表为一个字符串数组,其描述如下: Char *rwtab[6] = {“begin”, “if”, “then”, “while”, “do”, “end”,}; 图3-1 (2)程序中需要用到的主要变量为syn,token和sum 3.2 扫描子程序的算法思想: 首先设置3个变量:①token用来存放构成单词符号的字符串;②sum用来整型单词;③syn用来存放单词符号的种别码。扫描子程序主要部分流程如图3-2所示。

编译原理实验报告

编译原理实验报告 一、实验目的 编译原理是计算机科学中的重要课程,旨在让学生了解编译器 的基本工作原理以及相关技术。本次实验旨在通过设计和实现一 个简单的编译器,来进一步加深对编译原理的理解,并掌握实际 应用的能力。 二、实验环境 本次实验使用了Java编程语言及相关工具。在开始实验前,我 们需要安装Java JDK并配置好运行环境。 三、实验内容及步骤 1. 词法分析 词法分析是编译器的第一步,它将源代码分割成一系列词法单元。我们首先实现一个词法分析器,它能够将输入的源代码按照 语法规则进行切割,并识别出关键字、标识符、数字、运算符等。

2. 语法分析 语法分析是编译器的第二步,它将词法分析得到的词法单元序列转化为语法树。我们使用自顶向下的LL(1)语法分析算法,根据文法规则递归地构建语法树。 3. 语义分析 语义分析是编译器的第三步,它对语法树进行检查和转换。我们主要进行类型检查、语法错误检查等。如果源代码存在语义错误,编译器应该能够提供相应的错误提示。 4. 代码生成 代码生成是编译器的最后一步,它将经过词法分析、语法分析和语义分析的源代码翻译为目标代码。在本次实验中,我们将目标代码生成为Java字节码。 5. 测试与优化

完成以上步骤后,我们需要对编译器进行测试,并进行优化。 通过多个测试用例的执行,我们可以验证编译器的正确性和性能。 四、实验心得 通过完成这个编译器的实验,我收获了很多。首先,我对编译 原理的知识有了更深入的理解。在实验过程中,我深入学习了词 法分析、语法分析、语义分析和代码生成等关键技术,对编译器 的工作原理有了更系统的了解。 其次,我提高了编程能力。实现一个完整的编译器需要处理复 杂的数据结构和算法,这对我的编程能力是一个很好的挑战。通 过实验,我学会了合理地组织代码,优化算法,并注意到细节对 程序性能的影响。 最后,我锻炼了解决问题的能力。在实验过程中,我遇到了很 多困难和挑战,但我不断地调试和改进代码,最终成功地实现了 编译器。这次实验使我明白了解决问题的关键在于坚持和勇于尝试。

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

编 译 原 理 实 验 报 告 实验一 一、实验名称:词法分析器的设计 二、实验目的: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<=122)) return(1); else return(0); } int digit(char s){ if((s>=48)&&(s<=57)) return(1); else return(0);

哈工大编译原理

哈工大编译原理 一、概述 编译原理是计算机科学中的一个重要分支,它研究如何将高级语言编写的程序转化为计算机能够执行的机器语言代码。哈尔滨工业大学编译原理课程是计算机科学与技术专业的必修课程之一,主要涵盖了编译原理的基本概念、语法分析、语义分析、中间代码生成、目标代码生成等内容。 二、基本概念 1. 编译器和解释器 编译器和解释器都是将高级语言翻译成低级语言的工具,但两者有着不同的工作方式。编译器将整个源程序一次性翻译成目标程序,然后再运行目标程序;而解释器则逐行地读入源程序,并立即执行相应的操作。因此,编译器通常会比解释器运行更快,但需要预先编译整个程序;而解释器则可以直接在运行时进行调试。 2. 语言处理系统

语言处理系统包括了编写高级语言程序所需的各种软件工具。其中包括了编辑器(用于编辑源代码)、汇编器(用于将汇编代码转换为机器码)、链接器(用于将多个目标文件组合成一个可执行文件)等。 3. 词法分析 词法分析是编译器中的第一步,它将源程序中的字符序列转换为有意义的单词序列。在这个过程中,编译器会忽略空格、制表符和换行符等无关字符,并将单词分类为不同的记号(token)类型。 4. 语法分析 语法分析是编译器中的第二步,它将词法分析得到的记号序列转换为语法树。在这个过程中,编译器会根据语言规则进行语法检查,并将语句按照优先级和结合性进行组合。 5. 语义分析 语义分析是编译器中的第三步,它对语法树进行处理并生成相应的中间代码。在这个过程中,编译器会检查变量和常量是否被正确地声明和使用,并进行类型检查、作用域检查等操作。 6. 中间代码生成

中间代码生成是编译器中的第四步,它将源程序转换为一种类似于汇 编代码的低级表示形式。在这个过程中,编译器会将高级语言转换为 一种通用、可移植且易于优化的形式。 7. 目标代码生成 目标代码生成是编译器中的最后一步,它将中间代码转换为机器码或 汇编代码。在这个过程中,编译器会根据目标机器的特定要求进行优化,并生成相应的可执行文件。 三、语法分析 1. 自顶向下语法分析 自顶向下语法分析是一种从上到下的方法,它从起始符号开始,逐步 扩展成为整个句子。这种方法通常使用递归下降分析、LL(1)分析等算法。 2. 自底向上语法分析 自底向上语法分析是一种从下到上的方法,它从单词序列开始,逐步 合并成为更高层次的结构。这种方法通常使用LR(0)分析、SLR(1)

编译原理——语法分析程序设计实验报告

实验二语法分析程序设计 [实验目的]: 1.了解语法分析的主要任务。 2.熟悉编译程序的编制。 [实验内容]:根据某文法,构造一基本递归下降语法分析程序。给出分析过程中所用的产生式序列。 [实验要求]: 1.选择一个文法,进行实验,可选的文法包括以下三个: P190 4.8 P190 4.9 P190 4.10 2.设计语法分析程序的输出形式(输出应为语法树或推导),一个可以参考的 例子,可见图1。 3.编写递归下降语法分析程序(参考P148-149 Topdown parsing by recursive-descent),实现基本的递归下降分析器,能够分析任给的符号串是否为该文法所定义的合法句子。实验报告中要说明分析使用的方法。 4.根据所作业题选项e所给出的input,生成并输出分析过程中所用的产生式 序列(show the actions of parser): 1 产生式1 2 产生式2 …… 5.自已设计一个不合法的句子,作为输出进行分析,给出结果。 [实验过程] 本次实验选择的文法为P190 4.8 lexp->atom|list atom->number|identifier list->(lexp-seq) lexp-seq->lexp lexp-seq 1.写出实现的算法,并画流程图。 本次实验采用递归下降算法,算法流程图如下图1-1:

图1-1 算法流程图 2.根据你选择的文法,分析左递归或左因子是否会影响本算法的结果。 会影响本算法的结果。递归下降分析法要求的文法是LL(1)文法,需要消除左递归和左因子的影响。如果存在左因子,对相同的字符跳转到不同的函数,无法实现递归。 3.列举实验设计过程中出现的问题及解决的方法(至少3条,选择实验中最困 扰的问题)。 1).会多次输出accept/error结果 解决方案:所有的递归函数返回类型为int,若accept返回1,error返回0,在main主函数中统一判断输出语句。 2).生成推导式错误 解决方案:先定义两个字符串string d(保存整个推导式过程),e(保存单次的推导式)每次进行递归函数调用,进行e的更新和替换,再将执行 d+=”=>”+e语句,更新d字符串。 3).递归调用出错 解决方案:设置条件,再调用递归函数。 4.比较作业题和本次实验结果,分析递归下降和LL(1)算法的异同点。 相同点:都是针对LL(1)文法,都是从上而下分析进行语法分析。

哈工大 威海 编译原理 实验二 语法分析

哈尔滨工业大学(威海)计算机学院 编译原理实验报告 姓名院系计算机学院学号 任课教师指导教师闫健恩 实验地点宋健二楼机房实验时间 实验名称实验二LR语法分析技术 同组人无 预习报告(对实验主要内容的认识) 得分 (1)给出主要数据结构:分析栈、符号表、语法分析树; (2)将扫描器作为一个子程序,每次调用返回一个TOKEN; (3)程序界面:表达式输入、语法分析树的表示结果(文件或者图形方式); 实验内容(问题,思路,程序,结果)得分 (1)开发环境:vs2010 (2)输入:在运行打开的软件下(win32格式),输入相应的代码(即要进行词法分析的字符串) (3)输出:在输入字符串后,按回车键后,既可以得到相应的词法分析的结果 (4)在相应的运行程序的文件夹中生成一个txt文件,用来存储生成的Token 链表 (5)系统功能: 1、词法分析:将输入的字符串进行单词级别的分析并且生成且输 出Token表 2、语法生成器:可以将语法生成相应的状态,在这个实验中共有 语法如下: 3、CLOSURE生成 4、LR项集族的生成 6、Goto表的生成 7、Scaner词法分析器将Token表输出 8、语法分析器对Token表的分析,得出结果 (2)开发平台(操作系统、设计语言): 1、操作系统:windows 7 2、设计语言:c++ 3、编译器:vs2010

(3)设计方案; 1)主数据流图; 开始 读取构造的文法(grammar.txt) 构造item.txt 集族 构造action表,写入文档 进行语法的匹配(自底向上RL(1)) 匹配时出现错误? 查找action表继续进行匹配如果代码分析还未完成,继续 结束Y N

编译原理实验二LL(1)语法分析实验报告

专题3_LL(1)语法分析设计原理与实现 李若森 13281132 计科1301 一、理论传授 语法分析的设计方法和实现原理;LL(1) 分析表的构造;LL(1)分析过程;LL(1)分析器的构造。 二、目标任务 实验项目 实现LL(1)分析中控制程序(表驱动程序);完成以下描述算术表达式的 LL(1)文法的LL(1)分析程序。 G[E]: E→TE’ E’→ATE’|ε T→FT’ T’→MFT’|ε F→(E)|i A→+|- M→*|/ 设计说明 终结符号i为用户定义的简单变量,即标识符的定义。加减乘除即运算符。 设计要求 (1)输入串应是词法分析的输出二元式序列,即某算术表达式“专题 1”的输出结果, 输出为输入串是否为该文法定义的算术表达式的判断结果; (2)LL(1)分析程序应能发现输入串出错; (3)设计两个测试用例(尽可能完备,正确和出错),并给出测试结果。 任务分析 重点解决LL(1)表的构造和LL(1)分析器的实现。

三、实现过程 实现LL(1)分析器 a)将#号放在输入串S的尾部 b)S中字符顺序入栈 c)反复执行c),任何时候按栈顶Xm和输入ai依据分析表,执行下述三个动作之一。 构造LL(1)分析表 构造LL(1)分析表需要得到文法G[E]的FIRST集和FOLLOW集。 构造FIRST(α) 构造FOLLOW(A)

构造LL(1)分析表算法 根据上述算法可得G[E]的LL(1)分析表,如表3-1所示: 表3-1 LL(1)分析表 主要数据结构 pair: 用pair来存储单个二元组。该对照表由专题1定义。 map: 存储离散化后的终结符和非终结符。 vector[][]: 存储LL(1)分析表 函数定义 init: void init(); 功能: 初始化LL(1)分析表,关键字及识别码对照表,离散化(非)终结符 传入参数: (无) 传出参数: (无) 返回值: (无)

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

编译原理实验一·词法分析

一、实验目的 通过动手实践,使学生对构造编译系统的基本理论、编译程序的基本结构有更为深入的理解和掌握;使学生掌握编译程序设计的基本方法和步骤;能够设计实现编译系统的重要环节。同时增强编写和调试程序的能力。 二、实验内容及要求 对某特定语言A ,构造其词法规则。 该语言的单词符号包括: 保留字(见左下表)、标识符(字母大小写不敏感)、整型常数、界符及运算符(见右下表) 。 功能要求如下所示: ·按单词符号出现的顺序,返回二元组序列,并输出。 ·出现的标识符存放在标识符表,整型常数存放在常数表,并输出这两个表格。 ·如果出现词法错误,报出:错误类型,位置(行,列)。 ·处理段注释(/* */),行注释(//)。 ·有段注释时仍可以正确指出词法错误位置(行,列)。 三、实验过程 1、词法形式化描述 使用正则文法进行描述,则可以得到如下的正规式: 其中ID表示标识符,NUM表示整型常量,RES表示保留字,DEL表示界符,OPR表示运算符。 A→(ID | NUM | RES | DEL | OPR) * ID→letter(letter | didit)* NUM→digit digit* letter→a | …| z | A | …| Z digit→0 | …| 9 RES→program | begin | end | var | int | and | or | not | if | then | else | while | do DEL→( | ) | . | ; | , OPR→+ | * | := | > | < | = | >= | <= | <>

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

一、实验目的 设计一个简单的词法分析器,从而进一步加深对词法分析器工作原理的明白得。 二、实验要求 一、该个词法分析器要求至少能够识别以下几类单词: (1)关键字:else if int return void while共6个,所有的关键字都是保留字,而且必需是小写; (2)标识符:识别与C语言词法规定相一致的标识符,通过以下正那么表达式概念:ID = letter (letter | digit)*; (3)常数:NUM = digit digit*(.digit digit* |ε)(e(+ | - |ε) digit digit* |ε),letter = a|..|z|A|..|Z|,digit = 0|..|9,包括整数,如123等;小数,如123.45等;科学计数法表示的常数,如1.23e3,2.3e-9等; (4)专用符号:+ - * / < <= > >= == != = ; , ( ) [ ] { } /* */; 二、分析器的输入为由上述几类单词组成的程序,输出为该段程序的机内表示形式,即关键字、运算符、界限符变成其对应的机内符,常数利用二进制形式,标识符利用相应的标识符表指针表示。 3、词法分析器应当能够指出源程序中的词法错误,如不可识别的符号、错误的词法等。 三、实验环境 实验环境为win7系统、vs2005。 四、实验内容 1、词法分析程序的功能: 输入:所给文法的源程序字符串。 输出:二元组(syn,token)或(sum或fsum,对应二进制)组成的序列。 其中:syn为单词类别码; token为寄存的单词自身字符串; sum为整型常数; fsum为浮点型常数。 二、各类单词符号类别码如下表:

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

编译原理实验报告语义分析 实验名称:语义分析 实验目的: 1.掌握词法分析器生成的词法单元序列的构造; 2.学会设计语法分析器,实现对程序的基本语法结构检查,并生成抽 象语法树; 3.学习语义规约的实现,实现对程序的语义分析和错误检查; 4.熟悉语义分析向语法分析的接口。 实验原理: 语义分析是编译过程的一个重要环节,它的主要任务是对生成的抽象 语法树进行遍历,并验证程序的类型一致性、语义规则的正确性、错误的 检查和恢复等。语义分析的输入是由语法分析生成的抽象语法树,输出是 继续优化的抽象语法树或中间代码,以供后续的中间代码生成等工作使用。实验步骤: 1.设计语法分析器,包括语法规则、优先级关系等; 2.生成词法单元序列; 3.构建语法分析器,进行语法分析,并生成抽象语法树; 4.针对不同的语义规约,设计语义动作,实现对程序的语义分析和错 误检查; 5.完成语义分析器的构建和测试。

实验设备: 1.计算机; 2. 编程语言:C++/Java/Python等; 3. 开发环境:Visual Studio/ Eclipse/PyCharm等。 实验结果: 通过对语法分析生成的抽象语法树进行遍历,实现了对程序的语义分析和错误检查。具体实现包括: 1.类型检查:根据语义规约,对程序中的类型进行检查,包括变量的声明及使用、函数的调用、赋值语句的一致性等; 2.作用域检查:检查变量的作用域和可见性等; 3.错误检查:检测语义错误,如变量未声明、函数重复定义等; 4.错误恢复:当检测到错误时,采取适当的错误恢复措施,如跳过错误的部分继续分析、提示错误信息等。 实验心得: 本次实验主要学习了语义分析的原理和实现方法,深入了解了编译过程中各个环节的作用和关系。通过实践操作,加深了对语法分析和语义分析的理解,提高了编程能力和解决问题的能力。同时,实验过程中也遇到了一些挑战和困难,例如语义规约的设计和实现、错误检查和恢复等,但通过查阅资料和与同学讨论,最终解决了这些问题。通过本次实验,我对编译原理和语义分析有了更深入的了解,并且对以后的学习和工作有了更好的准备。

编译原理-语法分析程序设计(预测分析法)

1.实验目的 构造文法的语法分析程序实验要求, 2.实验要求 采用预测分析法对输入的字符串进行语法分析。 3.实验环境 V 4.实验原理 对文法G进行语法分析,文法G如下所示: *0. S→a */ *1. S→^ *2. S→(T) *3. T→SW * *4. W→,SW *5. W→ε; 5.软件设计与编程 #include #include #include char str[100]; //存储待分析的句子 const char T[ ] = "a^(),#"; //终结符,分析表的列符 const char NT[ ] = "STW"; //非终结符,分析表的行符 /*指向产生式右部符号串*/ const char *p[] = { /*0. S→a */ "a", /*1. S→^ */ "^", /*2. S→(T) */ "(T)", /*3. T→SW */ "SW", /*4. W→,SW */ ",SW", /*5. W→ε; */ "" }; //设M[i][j]=x,通过p[M[i][j]]=p[x]获取右部符号串。 const int M[][6] = { /* a ^ ( ) , # */ /*S*/ { 0, 1, 2, -1, -1, -1 }, /*T*/ { 3, 3, 3, -1, -1, -1 }, /*W*/ { -1, -1,-1, 5, 4, -1 } }; void init()//输入待分析的句子

printf("请输入待分析的句子(以$结束):\n"); scanf("%s",str); } int lin(char c);//非终结符转换为行号 int col(char c);//终结转换为列号 bool isNT(char c);//isNT判断是否是非终结符 bool isT(char c);//isT判断是否是终结符。 void main(void) { int i,j=0; int flag=1,flag2=0; char A; //设置指示句子的当前字符 char stack[20]= {'#','S'}; //栈赋初值 int top = 1 ; //设置栈顶指针 char X = ' ' ; //存储栈顶字符 init(); A=str[0]; printf("\t步数\t分析栈\t输入串\t所用规则\n"); //在屏幕上输出列表标题while ( 1 ) { printf("\n\t(%d)\t",++j); //输出当前执行步数 for ( i = 0 ; i <= top ; i++ ) //输出当前栈的内容(出栈前) { printf("%c",stack[i]); } printf("\t"); for ( i = flag-1 ; str[i]!='$' ; i++ ) { printf("%c",str[i]); } if(flag2==1) { printf("\t%d",M[ lin(X) ][col(A)]); flag2=0; } //出栈 X = stack[top--] ; if (X=='#')//是结束符 { if (X==A)//是结束符 { printf("\tAcc\n"); }

《编译原理》课程实验指导书.docx

《编译原理》课程实验指导书 (Compiler Principle)

目录 序言 (1) 一、实验安排 (2) 第一阶段:编译器的词法分析 (2) 第二阶段:编译器的语法分析 (2) 第三阶段:编译器的代码生成 (3) 二、考核方式及评定标准 (4) 三、参考资料与编译器分析 (4) 第一部分PL语言及其编译器 (4) 1.PL语言介绍 (4) 1.1 PL语言的语法图 (5) 2.PL语言编译器 (8) 2.1词法分析 (9) 2.2语法分析 (9) 2.3语义分析 (11) 2.4代码生成 (11) 2.5代码执行 (13) 2.6错误诊断处理 (15) 2.7符号表管理 (17) 2.8其他 (18) 第二部分上机实验要求 (19) 第三部分PL语言编译器源程序与示例 (21) 1 • 示例与结果表示 (21) 1.1 PL语言源程序 (21) 1.2生成的代码(片段) (23) 2.PL语言编译器源程序 (23)

序言 本《编译原理》实验,其目的是让大家动手设计和实现一个规模适中的语言的编译器,该编译器不仅涉及编译程序的各个阶段,而且也强调了编译的总体设计、各个阶段的接口安排等等。 通过上机实践,来设计这个相对完整的编译器,一方面可以使同学们增加对编译程序的整体认识和了解——巩固《编译原理》课程所学知识,另一方面,通过上机练习,学生也可以学到很多程序调试技巧和设计大型程序一般的原则,如模块接口的协调,数据结构的合理选择等等。 为了使学生能尽早动手实践,我们建议把实践分成三部分,首先阅读本教程第一部分,在这部分就PL语言的语法及其编译程序的各个阶段作了简单介绍,以便对PL 编译程序有个初步的印象。其次要认真阅读理解第三部分所给出的PL 编译器源程序及示例,使上一阶段的初步印象得以加深、具体化。最后按照第二部分的实验要求扩充PL语言的功能并加以实现。 具体操作时分成三个阶段:词法分析、语法分析及代码生成。最后再统一组装成一个完整的PL编译器,并适当进行改进、补充。

实验1-2 《编译原理》词法分析程序设计方案

实验2-3 《编译原理》S语言词法分析程序设计方案 一、实验目的 了解词法分析程序的两种设计方法:根据状态转换图直接编程的方式;利用DFA编写通用的词法分析程序. 二、实验内容 1.根据状态转换图直接编程 编写一个词法分析程序,它从左到右逐个字符的对源程序进行扫描,产生一个个的单词的二元式,形成二元式(记号)流文件输出。在此,词法分析程序作为单独的一遍,如下图所示。 具体任务有: (1)组织源程序的输入 (2)拼出单词并查找其类别编号,形成二元式输出,得到单词流文件 (3)删除注释、空格和无用符号 (4)发现并定位词法错误,需要输出错误的位置在源程序中的第几行。将错误信息输出到屏幕上。 (5)对于普通标识符和常量,分别建立标识符表和常量表(使用线性表存储),当遇到一个标识符或常量时,查找标识符表或常量表,若存在,则返回位置,否则返回0并且填写符号表或常量表。 标识符表结构:变量名,类型(整型、实型、字符型),分配的数据区地址 注:词法分析阶段只填写变量名,其它部分在语法分析、语义分析、代码生成等阶段逐步填入。 常量表结构:常量名,常量值 2. 编写DFA模拟程序 算法如下: DFA(S=S0,MOVE[][],F[],ALPHABET[],ALLS[]) /*S为状态,初值为DFA的初态,MOVE[][]为状态转换矩阵,F[] 为终态集,ALPHABET[] 为字母表,其中的字母顺序与MOVE[][] 中列标题的字母顺序一致。ALLS[]为状态集*/ { Char Wordbuffer[10]=“”//单词缓冲区置空 Nextchar=getchar();//读字符 i=0; while(nextchar!=NULL)//NULL代表此类单词 { if (nextcha r!∈ALPHABET[]){ERROR(“非法字符”),return(“非法字符”);} S=MOVE[S][nextchar] //下一状态 if(S=NULL)return(“不接受”);//下一状态为空,不能识别,单词错误 wordbuffer[i]=nextchar ;//保存单词符号 i++; nextchar=getchar(); } Wordbuffer[i]=‘\0’; If(S∈F)return(wordbuffer);//接受 Else return(“不接受”);

编译原理实验报告2-词法分析程序的设计

实验2 词法分析程序的设计 一、实验目的 掌握计算机语言的词法分析程序的开发方法。 二、实验容 编制一个能够分析三种整数、标识符、主要运算符和主要关键字的词法分析程序。 三、实验要求 1、根据以下的正规式,编制正规文法,画出状态图; 标识符<字母>(<字母>|<数字字符>)* 十进制整数0 | ((1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*) 八进制整数0(1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)* 十六进制整数0x(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)* 运算符和界符+ - * / > < = ( ) ; 关键字if then else while do 2、根据状态图,设计词法分析函数int scan( ),完成以下功能: 1)从文本文件中读入测试源代码,根据状态转换图,分析出一个单词, 2)以二元式形式输出单词<单词种类,单词属性> 其中单词种类用整数表示: 0:标识符 1:十进制整数 2:八进制整数 3:十六进制整数 运算符和界符,关键字采用一字一符,不编码 其中单词属性表示如下: 标识符,整数由于采用一类一符,属性用单词表示 运算符和界符,关键字采用一字一符,属性为空 3、编写测试程序,反复调用函数scan( ),输出单词种别和属性。 四、实验环境 PC微机 DOS操作系统或Windows 操作系统 Turbo C 程序集成环境或Visual C++ 程序集成环境 五、实验步骤 1、根据正规式,画出状态转换图;

编译原理词法分析程序设计实验报告

编译原理词法分析程序设计实验报告 LT

#include #include typedef struct words { int id; char name[20]; char value[20]; }word; char integer[20]={'i','n','t'}; char iff[20]={'i','f'}; char elsee[20]={'e','l','s','e'}; char forr[20]={'f','o','r'}; int main() { char code[10000]; char words[20],ch; int i,j,p,count,n,m; int k=0; word symbol[500]; printf("种别码:1 类别:关键字int\n"); printf("种别码:2 类别:关键字if\n"); printf("种别码:3 类别:关键字

else\n"); printf("种别码:4 类别:关键字for\n"); printf("种别码:5 类别:标识符\n"); printf("种别码:6 类别:计算运算符\n"); printf("种别码:7 类别:关系运算符\n"); printf("种别码:8 类别:界符\n"); while(1) { gets(code); n=strlen(code); for(m=0,j=0;m='a'&&code[m]<='z')||(code[m] >='0'&&code[m]<='9')) { words[j]=code[m]; j++; } else

(完整版)哈工大编译原理习题及答案

何谓源程序、目标程序、翻译程序、编译程序和解释程序它们之间可能有何种关系 一个典型的编译系统通常由哪些部分组成各部分的主要功能是什么 选择一种你所熟悉的程序设计语言,试列出此语言中的全部关键字,并通过上机使用该语言以判明这些关键字是否为保留字。 选取一种你所熟悉的语言,试对它进行分析,以找出此语言中的括号、关键字END以及逗号有多少种不同的用途。 试用你常用的一种高级语言编写一短小的程序,上机进行编译和运行,记录下操作步骤和输出信息,如果可能,请卸出中间代码和目标代码。 第一章习题解答 1.解:源程序是指以某种程序设计语言所编写的程序。目标程序是指编译程序(或解释程序)将 源程序处理加工而得的另一种语言(目标语言)的程序。翻译程序是将某种语言翻译成另一种语言的程序的统称。编译程序与解释程序均为翻译程序,但二者工作方法不同。解释程序的特点是并不先将高级语言程序全部翻译成机器代码,而是每读入一条高级语言程序语句,就用解释程序将其翻译成一段机器指令并执行之,然后再读入下一条语句继续进行解释、执行,如此反复。即边解释边执行,翻译所得的指令序列并不保存。编译程序的特点是先将高级语言程序翻译成机器语言程序,将其保存到指定的空间中,在用户需要时再执行之。即先翻译、后执行。

2.解:一般说来,编译程序主要由词法分析程序、语法分析程序、语义分析程序、中间代码生成 程序、代码优化程序、目标代码生成程序、信息表管理程序、错误检查处理程序组成。 3.解:C语言的关键字有:auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while。上述关键字在C语言中均为保留字。 4.解:C语言中括号有三种:{},[],()。其中,{}用于语句括号;[]用于数组;()用于函数(定 义与调用)及表达式运算(改变运算顺序)。C语言中无END关键字。逗号在C语言中被视为分隔符和运算符,作为优先级最低的运算符,运算结果为逗号表达式最右侧子表达式的值(如:(a,b,c,d)的值为d)。 5.略 第二章前后文无关文法和语言 21设有字母表A1={a,b,…,z},A2={0,1,…,9},试回答下列问题: (1) 字母表A1上长度为2的符号串有多少个 (2) 集合A1A2含有多少个元素 (3) 列出集合A1 (A1∪A2)*中的全部长度不大于3的符号串。 22试分别构造产生下列语言的文法。 (1) {anbn|n≥0}; (2) {anbmcp|n,m,p≥0}; (3) {an#bn|n≥0}∪{cn#dn|n≥0};

相关主题
文本预览
相关文档 最新文档