编译原理实验报告:Lex与Yacc构造及应用.pdfVIP

  • 0
  • 0
  • 约1.39万字
  • 约 8页
  • 2026-02-06 发布于北京
  • 举报

编译原理实验报告:Lex与Yacc构造及应用.pdf

编译原理实验报告

小组

一项目目的

1.巩固大三上学期编译原理理论课程的学习成果,加深对编译原理及程序构造过程的理

解。

2.增强程序设计能力。

二项目内容要求

本次实验分为两部分,第一部分是词法分析Lex的构造,第二部分是语法分析

Yacc的构造。另外,根据自己开发的工具,生成C语言子集的词法分析器和语法

分析器。具体内容要求如下:

1.Lex

(1)Lex输入文件的解析

(2)正规表达式的解析

(3)一个正规表达式到NFA的转换算法实现

(4)多个NFA的合并

(5)NFA的确定化和最小化算法实现

(6)返回状态与返回内容的对应

(7)SeuLex应用

2.Yacc

(1)Yacc输入文件的解析

(2)上下文无关文法到对应LR(1)文法的下推自动机的构造

(3)LR(1)文法的下推自动机到相应分析表的构造

(4)LR(1)总控程序的构造(查表程序)

(5)LR(1)到LALR(1)的映射(*)

(6)符号表的构建与相应管理程序

(7)语义动作程序的加入

(8)SeuYacc的应用

其中(*)表示是我们未能完成的功能。

三项目中主要数据结构定义

本次实验中我们使用了大多数STL中的数据结构,具体情况如下:

stack,queue,hash_set,hash_map,set,map,vector,list

1.Lex

Lex中主要数据结构就是关于NFA和DFA图的构造。实验中我们采用自定义结点类

Node来形成图的结点。Node中有两个数据域,一个是边的权值,另一个边所连向的点,

而采用有向图来表示NFA和DFA。具体如下:

vectorlistNodenfa,dfa;

2.Yacc

Yacc中的主要数据结构比较多。

I.对于读进的符号串,用两张表,一张是符符号表,另一张是非符符号表,索引

值为字符串,内容为对应的符号在程序中的内码值,为int型。这种表采用

hash_mapstring,int类型实现。

II.对于产生式,采用自定义结构Producer定义。具体如下:

structProducer

{intleft;vectorintright;};

并在程序中用一个全局数据vectorProducerProducerSet来所有产生式,而在其它

需要使用到产生式的地方全部保存索引值即可,大大缩短所耗内存空间。

III.对于项目集构造算法中的项目,采用自定义类实现。具体如下:

classItem

{

public:

friendbooloperator(constItemit1,constItemit2);

Item(intproducerNum,intcurrentPos);

intgetCurrSym();//返回下一个将要移进的符号,如果已经到达最后,则返回-1,表

示可归约。

intgetNextSym()const;//返回再一下要移进的符号,在求闭包运算中计算搜索符时

使用。

intgetProdN();//返回产生式的编号。

boolisEnd();//是否右部已经全部移进。

boolnextIsEnd()const;//右部是否到达最后一个符号,求闭包运算时用。

voidsetSearchSym(consthash_setintsearchSymbol);

consthash_setintgetSearchSym()const;

voidmove();

private:

intpn;//产生式的编号。

intpos;//此项目的移进位置。

hash_setintsearchSym;//此项目的搜索符,作为公共可以让外部函数first

直接使用

};

四主要思路及算法描述

1.Lex部分

这部分的主要算法就是按照编译原理书上所给的思路进行正规式到NFA的构造,然后是NFA

到DFA的转换,DFA的最小化,最后是DFA整合其余部分到词法分析器代码的输出。具体开

发思路如下:

①正规式到

您可能关注的文档

文档评论(0)

1亿VIP精品文档

相关文档