编译原理实验报告_第1页
编译原理实验报告_第2页
编译原理实验报告_第3页
编译原理实验报告_第4页
免费预览已结束,剩余35页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

2、 #define id 12/标识符 #define 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,whi

3、le,and,or,not ; for (i = 0;i 22;i+) if (strcmp(keyi, a) = 0)/该字符串是否与关键字相匹配 return (i % 11 + 1); return 0; /把 a输入到指定文件中,然后从该文件中读出字符串,放到一个数组中输出 void out(int a, char *b) file *write; write = fopen(e:b.txt, a+); if (write = null) printf(文件打开失败); exit(0); fprintf(write, %dt, a); fwrite(b, strlen(b), 1, w

4、rite); fprintf(write, n); fclose(write); printf(%d %20stt, a, b); int error() printf(书写格式错误,未被识别n); return 0; void function(file *fp) char ch = " " int i, c; while (ch != eof) ch = fgetc(fp);/从文件中读取字符 while (ch = " " | ch = "t" | ch = "n") ch = fgetc(fp); if (

5、isalpha(ch) /isalpha()判断是否为英文字母,是则返回非 零值,否则返回零 token0 = ch; ch = fgetc(fp); i = 1; while (isalnum(ch) /isalnum()判断字符是否为英文字 母或数字,如果是则返回非零值,如果不是则返回零/ tokeni = ch; i+; ch = fgetc(fp); tokeni = "0" fseek(fp, -1, 1); /用于二进制方式打开的文件,移动文件读写指针位置 c = looksame(token); if (c = 0) out(id, token);printf

6、(标识符n); else out(c, token);printf(关键字n); else if (isdigit(ch) /isdigit()判断是否为0-9 的数字 token0 = ch; ch = fgetc(fp); i = 1; while (isdigit(ch) tokeni = ch; i+; ch = fgetc(fp); tokeni = "0" fseek(fp, -1, 1); out(int, token); printf(常数n); else switch (ch) case"+":out(ysf, +);printf(运算

7、符n); break; case"-":out(ysf, -);printf(运算符n); break; case"":out(jf, ;);printf(界符n); break; case",":out(jf, ,);printf(界符n); break; case"|":out(ysf, |);printf(运算符n); break; case"":out(jf, );printf(界符n); break; case"(":out(jf, ();printf(界符n);

8、break; case"!":out(jf, !);printf(界符n); break; case"":out(jf, );printf(界符n); break; case")":out(jf, );printf(界符n); break; case"":out(jf, );printf(界符n); break; case"":ch = fgetc(fp); if (ch = "=") out(ysf, =); printf(运算符n); else if (ch = &quo

9、t;") out(ysf, ); printf(运算符n); else fseek(fp, -1, 1); out(ysf, ); printf(运算符n); break; case"=":out(ysf, =);printf(运算符n); break; case"":ch = fgetc(fp); if (ch = "=") out(ysf, =); printf(运算符n); else fseek(fp, -1, 1); out(ysf, ); printf(运算符n); break; case":"

10、:ch = fgetc(fp); if (ch = "=") out(ysf, :=); printf(运算符n); else fseek(fp, -1, 1); out(jf, :); printf(界符n); break; case"/":ch = fgetc(fp); if (ch = "*") out(jf, /*); printf(界符n); while (1)/解释的内容在词法分析中不显示 while (ch != "/") ch = fgetc(fp); fseek(fp, -2, 1); ch =

11、fgetc(fp); if (ch = "*") fseek(fp, 1, 1); break; else fseek(fp, 2, 1); ch = fgetc(fp); fseek(fp, -2, 1); else fseek(fp, -1, 1); out(jf, /); printf(界符n); break; case"*":ch = fgetc(fp); if (ch = "/") out(jf, */); printf(界符n); else fseek(fp, -1, 1); out(ysf, *); printf(运算符

12、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:b.txt 目录下=n); printf(= =n); functi

13、on(read); fclose(read); system(pause); return 0; 四、实验截图 a.txt b.txt 基于 ll(1)方法的语法分析程序 一、 实验目的 设计、编制和调试一个典型的语法分析方法,进一步掌握常用的语法分析方法。 二、实验要求 1、根据 ll(1)分析法编写一个语法分析程序,可根据自己实际情况,选择以下一项作为分析算法的输入: a.直接输入根据已知文法构造的分析表 m; b.输入文法的 first()和 follow(u)集合,由 程序自动生成文法的分析表 m; c.输入已知文法,由程序自动构造文法的分析表m。 2、程序具有通用性 所开发的程序可适

14、用于不同的文法和任意输入串,且能判断该文法是否为 ll(1)文法。 3、有运行实例 对于输入的文法和符号串,所编制的语法分析程序应能正确判断此串是否为文法的句子,并要求输出分析过程。 三、实验代码 #include stdafx.h #includestdio.h #includestdlib.h #includestring.h #includedos.h char a20;/*分析栈*/ char b20;/*剩余串*/ char v120 = "i","+","*","(",")",&qu

15、ot;#" ;/*终结符 */ char v220 = "e","g","t","s","f" ;/*非终结符 */ int j = 0, b = 0, top = 0, l;/*l 为输入串长度 */ typedef struct type /*产生式类型定义 */ char origin; /*大写字符 */ char array5; /*产生式右边字符 */ int length; /*字符个数 */ type; type e, t, g, g1, s, s1, f, f1;/*

16、结构体变量 */ type c1010;/*预测分析表 */ void print()/*输出分析栈 */ int a;/*指针*/ for (a = 0;a = top + 1;a+) printf(%c, aa); printf(tt); /*print*/ void print1()/*输出剩余串*/ int j; for (j = 0;jb;j+)/*输出对齐符*/ printf( ); for (j = b;j = l;j+) printf(%c, bj); printf(ttt); int _tmain(int argc, _tchar* argv) int m, n, k = 0

17、, flag = 0, finish = 0; char ch, x; type cha;/*用来接受 cmn*/ /*把文法产生式赋值结构体*/ e.origin = "e" strcpy(e.array, tg); e.length = 2; t.origin = "t" strcpy(t.array, fs); t.length = 2; g.origin = "g" strcpy(g.array, +tg); g.length = 3; g1.origin = "g" g1.array0 = "&

18、quot; g1.length = 1; s.origin = "s" strcpy(s.array, *fs); s.length = 3; s1.origin = "s" s1.array0 = "" s1.length = 1; f.origin = "f" strcpy(f.array, (e); f.length = 3; f1.origin = "f" f1.array0 = "i" f1.length = 1; for (m = 0;m = 4;m+)/*初始化

19、分析表*/ for (n = 0;n = 5;n+) cmn.origin = "n"/*全部赋为空*/ /*填充分析表*/ c00 = e;c03 = e; c11 = g;c14 = g1;c15 = g1; c20 = t;c23 = t; c31 = s1;c32 = s;c34 = c35 = s1; c40 = f1;c43 = f; printf(提示:本程序只能对由"i","+","*","(",")"构成的 以"#"结束的字符串进行分析,

20、n); printf(请输入要分析的字符串:); do/*读入分析串*/ scanf(%c, ch); if (ch != "i") (ch != "+") (ch != "*") (ch != "(") (ch != ")") (ch != "#") printf(输入串中有非法字符n); exit(1); bj = ch; j+; while (ch != "#"); l = j;/*分析串长度*/ ch = b0;/*当前分析字符*/ atop =

21、"#" a+top = "e"/*"#","e"进栈*/ printf(步骤tt 分析栈 tt 剩余字符 tt 所用产生式 n); do x = atop-;/*x 为当前栈顶字符*/ printf(%d, k+); printf(tt); for (j = 0;j = 5;j+)/*判断是否为终结符*/ if (x = v1j) flag = 1; break; if (flag = 1)/*如果是终结符*/ if (x = "#") finish = 1;/*结束标记*/ printf(ac

22、c!n);/*接受 */ getchar(); getchar(); exit(1); /*if*/ if (x = ch) print(); print1(); printf(%c匹配n, ch); ch = b+b;/*下一个输入字符*/ flag = 0;/*恢复标记*/ /*if*/ else/*出错处理*/ print(); print1(); printf(%c出错n, ch);/*输出出错终结符*/ exit(1); /*else*/ /*if*/ else/*非终结符处理*/ for (j = 0;j = 4;j+) if (x = v2j) m = j;/*行号*/ brea

23、k; for (j = 0;j = 5;j+) if (ch = v1j) n = j;/*列号*/ break; cha = cmn; if (cha.origin != "n")/*判断是否为空*/ print(); print1(); printf(%c-, cha.origin);/*输出产生式*/ for (j = 0;jcha.length;j+) printf(%c, cha.arrayj); printf(n); for (j = (cha.length - 1);j = 0;j-)/*产生式逆序入栈*/ a+top = cha.arrayj; if (at

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

25、知文法的项目集规范族和转换函数,由程序自动生成 lr(0)分析表; (3)输入已知文法,由程序自动生成 lr(0)分析表。 三、程序代码 #include stdafx.h #includeiostream #includestring.h #includeiomanip #includestdlib.h using namespace std; struct stack int top; int st15; /状态栈 char sn15; /符号栈 *sign; struct analysis /动作表结构 char act; int status; action6 = "s&qu

26、ot;,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 , "$&qu

27、ot;,0,"r",4,"r",4, "$",0,"r",4, "r",4 , "s",5,"$",0,"$",0, "s",4,"$",0, "$",0 , "$",0,"r",6,"r",6, "$",0,"r",6, "r",6 , "s&qu

28、ot;,5,"$",0,"$",0, "s",4,"$",0, "$",0 , "s",5,"$",0,"$",0, "s",4,"$",0, "$",0 , "$",0,"s",6,"$",0, "$",0,"s",11,"$",0 , "$&qu

29、ot;,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

30、 = "e",3 , "e",1 , "t",3 , "t",1 , "f",3 , "f",1 ; /此文法信息 int go3 = 1,2,3,99,99,99,99,99,99,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")

31、 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() cout 参照文法为:n (1)ee+tn (2)etn (

32、3)tt*f"n (4)tfn (5)f(e)n (6)fin; char instr20, *current, a; int i = 0, step = 0, ix1, ia, ix2, ig, ig, back; bool flag = true; sign = new stack; cout 请输入待分析的字符串(以#结束):n; do cin instri+; while (instri - 1 != "#"); instri = "0" current = instr; sign-st0 = 0;sign-sn0 = "#&

33、quot;sign-sn1 = "0"sign-top = 0; cout 步骤 setw(20) 状 态 setw(20) 符 号 setw(20) 输 入 串n; cout = setw(20) = setw(20) = setw(20) =n; cout step+ setw(20) sign-st0 setw(21) sign-sn setw(21) instr endl; while (flag) cout step+ setw(20); a = *current;ia = index(a); ix1 = sign-stsign-top; /couta ia ix

34、1 actionix1ia.act; /hhjhj if (ia = 99) cout 此文法无法识别该输入串!; break; if (actionix1ia.act = "s") sign-top += 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 - 1; /零下表开

35、始 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 此文法无法识别该输入串!; break; else if (actionix1ia.act = "$") cout 此文法无法识别该输入串!;

36、 break; else if (actionix1ia.act = "a") flag = false; for (i = 0;i = sign-top;i+) cout sign-sti ; cout setw(20 - (sign-top) sign-sn setw(20 - strlen(sign-sn) current endl; if (flag = false) cout 文法分析成功! endl; 四、实验截图 中间代码生成程序(逆波兰表示) 一、实验目的 加深对语义翻译的理解 二、实验要求 (1)编制一个中间代码生成程序,能将算术表达式等翻译成逆波兰形式;

37、 (2)程序具有通用性,即能接受各种不同的算术表达式等语法成分。 (3)有运行实例对于语法正确的算术表达式,能生成逆波兰表示,并输出结果;对不正确的表达式,能检测出错误。 (4) 提交实习报告,报告内容应包括: 目的、要求,算法描述,程序代码,运行截图 三、程序代码 #include stdafx.h #include iostream #include string using namespace std; class transform private: char s_stack20;/栈 string s_result;/转换之后的字符串,也就是后缀表达式 int top;/栈顶 pub

38、lic: 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;ia.length();i+) switch (ai) case "+": case "-": q=1; if (s_stacktop!="*"s_stacktop!="/"s_stacktop!="

39、;"s_stacktop!="+"s_stacktop!="-") push(ai); else while(s_stacktop="*"|s_stacktop="/"|s_stacktop=""|s_stacktop="+"|s_stacktop="-") s_result+=s_stacktop; pop(); push(ai); break; case "*": case "/": q=1; if (s_stacktop!=""s_stacktop!="*"s_stacktop!=&q

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论