ImageVerifierCode 换一换
格式:DOCX , 页数:14 ,大小:66.99KB ,
资源ID:12532460      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/12532460.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(编译原理实验报告1.docx)为本站会员(b****0)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

编译原理实验报告1.docx

1、编译原理实验报告1 李璐 宗婷婷一、上机题目:实现一个简单语言(CPL)的编译器(解释器)二、功能要求:接收以CPL编写的程序,对其进行词法分析、语法分析、语法制导翻译等,然后能够正确的执行程序。 三、试验目的1.加深编译原理基础知识的理解:词法分析、语法分析、语法制导翻译等2.加深相关基础知识的理解:数据结构、操作系统等 3.提高编程能力 4.锻炼独立思考和解决问题的能力 四、题目说明1.数据类型:整型变量(常量),布尔变量(常量) 取值范围, -2, -1, 0, 1, 2, , true, false2、运算表达式:简单的代数运算,布尔运算 3、程序语句:赋值表达式,顺序语句,if-el

2、se语句,while语句 五、环境配置1.安装Parser Generator、Visual C+; 2.分别配置Parser Generator、Visual C+; 3.使用Parser Generator创建一个工程 编写l文件mylexer.l; 编译mylexer.l,生成mylexer.h与mylexer.c; 4.使用VC+创建Win32 Console Application工程并 配置该项目; 加入mylexer.h与mylexer.c,编译工程; 执行标识符数字识别器; 注意:每次修改l文件后,需要重新编译l文件,再重新编译VC工程 六、 设计思路及过程 设计流程:词法分析

3、 LEX的此法分析部分主要利用有限状态机进行单词的识别,在分析该部分之前,首先应该对YACC的预定义文法进行解释。在YACC中用%union扩充了yystype的内容,使其可以处理char型,int型,node型,其中Node即为定义的树形结点,其定义如下:typedef enum TYPE_CONTENT, TYPE_INDEX, TYPE_OP NodeEnum; /* 操作符 */ typedef struct int name; /* 操作符名称 */ int num; /* 操作元个数 */ struct NodeTag * node1; /* 操作元地址 可扩展 */ OpNode

4、; typedef struct NodeTag NodeEnum type; /* 树结点类型 */ /* Union 必须是最后一个成员 */ union int content; /* 内容 */ int index; /* 索引 */ OpNode op; /* 操作符对象 */ ; Node; extern int Var26; 结点可以是三种类型(CONTENT,INDEX,OP)。结点如果是操作符对象(OpNode)的话,结点可继续递归结点。操作符结点包括了名称,个数和子结点三个要素,其中子结点可以为多个。 在YACC定义的文法中将与INTEGER,与VARIABLE绑定,表示对

5、lex返回的值自动进行类型转换。YACC的语法分析和语义制导 在YACC中首先定义了与函数相关的文法和与运算相关的文法,其中函数定义的文法中可以处理if-else,if,while,print,x=exp;类型,在与运算相关的文法中可以处理+,-,*,/,=,=,!=,&,|运算。在语义制导翻译部分主要目的是在内存建立一颗语法树来实现刚才所说的函数。扩展了set_index,set_value两个赋值语句,其操作实质是在内存空间分配index和value的两种树结点。opr这个扩展函数很重要,而且使用了动态参数,主要考虑操作符的操作元个数是可变的,这个也与头文件“struct NodeTag

6、* node1;”的定义思想一致。opr主要在内存空间中分配操作符相关的树结点。Set_index,set_value,opr从概念上是完全一致的,目的就是在内存中构造一颗可以递归的语法树。程序代码 mylexer.l文件如下: %#include #include node.h#include myparser.hvoid yyerror(char *);%/*(*|(*)*/)*(*)*/ ;while return WHILE;if return IF;else return ELSE;print return PRINT;false yylval.iValue = 0;return I

7、NTEGER;true yylval.iValue = 1;return INTEGER;a-z yylval.sIndex = *yytext - a;return VARIABLE;0-9+ yylval.iValue = atoi(yytext);return INTEGER;-()=+*/%;. return *yytext;= return GE;= return LE;= return EQ;!= return NE; return NE;& return AND;| return OR;! return NOT; tn+ ; /* 去除空格,回车 */. printf(unkno

8、w symbol:%sn,yytext);%int yywrap(void)return 1;myparser.y文件如下:% #include #include #include #include node.h /* 属性操作类型 */Node *opr(int name, int num, .);Node *set_index(int value);Node *set_content(int value);void freeNode(Node *p);int exeNode(Node *p);int yylexeNode(void);void yyerror(char *s);int Va

9、r26; /* 变量数组 */%union int iValue; /* 变量值 */ char sIndex; /* 变量数组索引 */ Node *nPtr; /* 结点地址 */%token VARIABLE%token INTEGER%token WHILE IF PRINT%nonassoc IFX%nonassoc ELSE%left AND OR GE LE EQ NE %right NOT%left + -%left * / %nonassoc UMINUS%type stmt expr stmt_list%program: function exit(0); ;functio

10、n: function stmt exeNode($2); freeNode($2); | /* NULL */ ;stmt: ; $ = opr(;, 2, NULL, NULL); | expr ; $ = $1; | PRINT expr ; $ = opr(PRINT, 1, $2); | VARIABLE = expr ; $ = opr(=, 2, set_index($1), $3); | WHILE ( expr ) stmt $ = opr(WHILE, 2, $3, $5); | IF ( expr ) stmt %prec IFX $ = opr(IF, 2, $3, $

11、5); | IF ( expr ) stmt ELSE stmt %prec ELSE $ = opr(IF, 3, $3, $5, $7); | stmt_list $ = $2; ;stmt_list: stmt $ = $1; | stmt_list stmt $ = opr(;, 2, $2, $1); ;expr: INTEGER $ = set_content($1); | VARIABLE $ = set_index($1); | expr + expr $ = opr(+, 2, $1, $3); | expr - expr $ = opr(-, 2, $1, $3); | e

12、xpr * expr $ = opr(*, 2, $1, $3); | expr / expr $ = opr(/, 2, $1, $3); | expr % expr $ = opr(%, 2, $1, $3); | expr expr $ = opr( expr $ = opr(, 2, $1, $3); | expr GE expr $ = opr(GE, 2, $1, $3); | expr LE expr $ = opr(LE, 2, $1, $3); | expr NE expr $ = opr(NE, 2, $1, $3); | expr EQ expr $ = opr(EQ,

13、2, $1, $3); | expr AND expr $ = opr(AND, 2, $1, $3); | expr OR expr $ = opr(OR, 2, $1, $3); | NOT expr $ = opr(NOT, 1, $2); | - expr %prec UMINUS $ = opr(UMINUS, 1, $2); | ( expr ) $ = $2; ;%#define SIZE_OF_NODE (char *)&p-content - (char *)p) Node *set_content(int value) Node *p; size_t sizeNode; /

14、* 分配结点空间 */ sizeNode = SIZE_OF_NODE + sizeof(int); if (p = malloc(sizeNode) = NULL) yyerror(out of memory); /* 复制内容 */ p-type = TYPE_CONTENT; p-content = value; return p;Node *set_index(int value) Node *p; size_t sizeNode; /* 分配结点空间 */ sizeNode = SIZE_OF_NODE + sizeof(int); if (p = malloc(sizeNode)

15、= NULL) yyerror(out of memory); /* 复制内容 */ p-type = TYPE_INDEX; p-index = value; return p; Node *opr(int name, int num, .) va_list valist; Node *p; size_t sizeNode; int i; /* 分配结点空间 */ sizeNode = SIZE_OF_NODE + sizeof(OpNode) + (num - 1) * sizeof(Node*); if (p = malloc(sizeNode) = NULL) yyerror(out

16、of memory); /* 复制内容 */ p-type = TYPE_OP; p-op.name = name; p-op.num = num; va_start(valist, num); for (i = 0; i op.nodei = va_arg(valist, Node*); va_end(valist); return p;void freeNode(Node *p) int i; if (!p) return; if (p-type = TYPE_OP) for (i = 0; i op.num; i+) freeNode(p-op.nodei); free (p);void

17、 yyerror(char *s) fprintf(stdout, %sn, s);int main(void) yyparse(); return 0;定义结点如下:union tagYYSTYPE int iValue; /* 变量值 */ char sIndex; /* 变量数组索引 */ Node *nPtr; /* 结点地址 */;extern YYSTYPE YYNEAR yylval;在本程序中,还有自定义的头文件node.h如下:typedef enum TYPE_CONTENT, TYPE_INDEX, TYPE_OP NodeEnum;/* 操作符 */typedef struct int name; /* 操作符名称 */ int num; /* 操作元个数 */ struct NodeTag * node1; /* 操作元地址 可扩展 */ OpNode;typedef struct NodeTag NodeEnum type; /* 树结点类型 */ /* Union 必须是最后一个成员 */ union int content; /* 内容 */ int index; /* 索引 */ OpNode op; /* 操作符对象 */ ; Node;extern int Var26;七、运行结果及测试程序

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1