收藏 分享(赏)

编译原理实验报告.doc

上传人:精品资料 文档编号:10629378 上传时间:2019-12-10 格式:DOC 页数:30 大小:465.68KB
下载 相关 举报
编译原理实验报告.doc_第1页
第1页 / 共30页
编译原理实验报告.doc_第2页
第2页 / 共30页
编译原理实验报告.doc_第3页
第3页 / 共30页
编译原理实验报告.doc_第4页
第4页 / 共30页
编译原理实验报告.doc_第5页
第5页 / 共30页
点击查看更多>>
资源描述

1、 编译原理实验报告Compilers Principles Experiment Report所在学院: 所在班级:学生姓名: 学 号: 指导教师:教 务 处2015 年 12 月词法分析程序一、实验目的:设计、编制和调试一个具体的词法分析程序,加深对词法分析的理解。二、实验要求:1、通过对 PL/0 词法分析程序(GETSYS)的分析,编制一个具有以下功能的词法分析程序:a.输入为字符串(或待进行词法分析的源程序),输出为单词串,即由(单词,类别)所组成的二元组序列;b.有一定的错误检查能力,例如能发现 2a 这类不能作为单词的字符串。三、实验代码#define ID 12/标识符#defi

2、ne INT 13/常数#define JF 14/界符#define YSF 15/运算符#define N 30/字符读取的最大长度char TOKENN;FILE *write;/查询一个字符串,看其是否与指定的字符相匹配,如果匹配返回 1 个非零的值,如果不匹配,则返回一个 0 值*/int looksame(char *a)int i;char*key22 = “begin“,“end“,“if“,“then“,“else“,“for“,“do“,“while“,“and“,“or“,“not“,“BEGIN“,“END“,“IF“,“THEN“,“ELSE“,“FOR“,“DO“,

3、“WHILE“,“AND“,“OR“,“NOT“ ;for (i = 0;i )out(YSF, “=“);printf(“运算符n“);elsefseek(fp, -1, 1);out(YSF, “);printf(“运算符n“);break;case:ch = fgetc(fp);if (ch = =)out(YSF, “:=“);printf(“运算符n“);elsefseek(fp, -1, 1);out(JF, “:“);printf(“界符n“);break;case/:ch = fgetc(fp);if (ch = *)out(JF, “/*“);printf(“界符n“);wh

4、ile (1)/注释的内容在词法分析中不显示while (ch != /)ch = fgetc(fp);fseek(fp, -2, 1);ch = fgetc(fp);if (ch = *)fseek(fp, 1, 1);break;elsefseek(fp, 2, 1);ch = fgetc(fp);fseek(fp, -2, 1);elsefseek(fp, -1, 1);out(JF, “/“);printf(“界符n“);break;case*:ch = fgetc(fp);if (ch = /)out(JF, “*/“);printf(“界符n“);elsefseek(fp, -1,

5、 1);out(YSF, “*“);printf(“运算符n“);break;case EOF:break;default:error();break;int main()FILE *read;read = fopen(“E:a.txt“, “r“);write = fopen(“E:b.txt“, “a+“);if (read = NULL)printf(“FILE OPEN FAIL!“);exit(0);printf(“=n“);printf(“=词法分析程序=n“);printf(“=该分析程序的文件存放在 E:a.txt 目录下=n“);printf(“=该程序的分析结果存放在 E:

6、b.txt 目录下=n“);printf(“=n“);function(read);fclose(read);system(“pause“);return 0;四、实验截图a.txt b.txt基于 LL(1)方法的语法分析程序1、实验目的设计、编制和调试一个典型的语法分析方法,进一步掌握常用的语法分析方法。二、实验要求1、根据 LL(1)分析法编写一个语法分析程序,可根据自己实际情况,选择以下一项作为分析算法的输入:a.直接输入根据已知文法构造的分析表 M;b.输入文法的 FIRST()和 FOLLOW(U)集合,由 程序自动生成文法的分析表 M;c.输入已知文法,由程序自动构造文法的分析表

7、M。2、程序具有通用性所开发的程序可适用于不同的文法和任意输入串,且能判断该文法是否为 LL(1)文法。3、有运行实例对于输入的文法和符号串,所编制的语法分析程序应能正确判断此串是否为文法的句子,并要求输出分析过程。三、实验代码#include “stdafx.h“#include#include#include#includechar A20;/*分析栈*/char B20;/*剩余串*/char v120 = i,+,*,(,),# ;/*终结符 */char v220 = E,G,T,S,F ;/*非终结符 */int j = 0, b = 0, top = 0, l;/*L 为输入串长

8、度 */typedef struct type /*产生式类型定义 */char origin; /*大写字符 */char array5; /*产生式右边字符 */int length; /*字符个数 */type;type e, t, g, g1, s, s1, f, f1;/*结构体变量 */type C1010;/*预测分析表 */void print()/*输出分析栈 */int a;/*指针*/for (a = 0;a “, cha.origin);/*输出产生式*/for (j = 0;j= 0;j-)/*产生式逆序入栈*/A+top = cha.arrayj;if (Atop

9、= )/*为空则不进栈*/top-;/*if*/else/*出错处理*/print();print1();printf(“%c 出错n“, x);/*输出出错非终结符*/exit(1);/*else*/*else*/ while (finish = 0);return 0;4、实验截图基于 LR(0)方法的语法分析程序一、实验目的设计、编制和调试一个典型的语法分析方法,进一步掌握常用的语法分析方法。二、实验要求可根据自己实际情况,选择以下一项作为分析算法的输入:(1)直接输入根据己知文法构造的 LR(0)分析表。(2)输入已知文法的项目集规范族和转换函数,由程序自动生成 LR(0)分析表;(3

10、)输入已知文法,由程序自动生成 LR(0)分析表。三、程序代码#include “stdafx.h“#include#include#include#includeusing namespace std;struct stack int top;int st15; /状态栈char sn15; /符号栈*sign;struct analysis /动作表结构char act;int status;action6 = s,5,$,0,$,0, s,4,$,0, $,0,$,0,s,6,$,0, $,0,$,0, A,0,$,0,r,2,s,7, $,0,r,2, r,2,$,0,r,4,r,4,

11、 $,0,r,4, r,4,s,5,$,0,$,0, s,4,$,0, $,0,$,0,r,6,r,6, $,0,r,6, r,6,s,5,$,0,$,0, s,4,$,0, $,0,s,5,$,0,$,0, s,4,$,0, $,0,$,0,s,6,$,0, $,0,s,11,$,0,$,0,r,1,s,7, $,0,r,1, r,1,$,0,r,3,r,3, $,0,r,3, r,3,$,0,r,5,r,5, $,0,r,5, r,5;analysis G = E,3,E,1,T,3,T,1,F,3,F,1; /此文法信息int go3 = 1,2,3,99,99,99,99,99,99,

12、99,99,99,8,2,3,99,99,99,99,9,3,99,99,10,99,99,99,99,99,99,99,99,99,99,99,99;int index(char m) int id;if (m = i) | (m = E) id = 0;else if (m = +) | (m = T) id = 1;else if (m = *) | (m = F) id = 2;else if (m = () id = 3;else if (m = ) id = 4;else if (m = #) id = 5;else id = 99;return id;void main() co

13、ut instri+; while (instri - 1 != #);instri = 0;current = instr;sign-st0 = 0;sign-sn0 = #;sign-sn1 = 0;sign-top = 0;cout st0 sn stsign-top; /couttop += 1;sign-snsign-top = a;sign-sn(sign-top) + 1 = 0;sign-stsign-top = actionix1ia.status;current+;else if (actionix1ia.act = r) iG = actionix1ia.status -

14、 1; /零下表开始back = GiG.status;sign-top -= back;ix2 = sign-stsign-top;ig = index(GiG.act);if (goix2ig != 99) sign-top += 1;sign-stsign-top = goix2ig;sign-snsign-top = GiG.act;sign-sn(sign-top) + 1 = 0;else cout top;i+)cout sti top) sn sn) #include using namespace std;class Transformprivate:char s_stack

15、20;/栈string s_result;/转换之后的字符串,也就是后缀表达式int top;/栈顶public:Transform()top=0;s_stack0=#;s_result=“;void pop()top-;void push(char b)top+;s_stacktop=b;string TF(string a)bool q=0;for (int i=0;is_in;Transform T;s_out=T.TF(s_in);cout“逆波兰表达式为:“s_outendl;system(“pause“);四、实验截图封面设计: 贾丽地 址:中国河北省秦皇岛市河北大街 438 号邮 编:066004电 话:0335-8057068传 真:0335-8057068网 址:http:/

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报