江苏科技大学编译原理实验报告.docx

上传人:小飞机 文档编号:3614877 上传时间:2023-03-14 格式:DOCX 页数:71 大小:55.79KB
返回 下载 相关 举报
江苏科技大学编译原理实验报告.docx_第1页
第1页 / 共71页
江苏科技大学编译原理实验报告.docx_第2页
第2页 / 共71页
江苏科技大学编译原理实验报告.docx_第3页
第3页 / 共71页
江苏科技大学编译原理实验报告.docx_第4页
第4页 / 共71页
江苏科技大学编译原理实验报告.docx_第5页
第5页 / 共71页
亲,该文档总共71页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《江苏科技大学编译原理实验报告.docx》由会员分享,可在线阅读,更多相关《江苏科技大学编译原理实验报告.docx(71页珍藏版)》请在三一办公上搜索。

1、江苏科技大学编译原理实验报告实验一 词法分析设计 一、实验目的 通过本实验的编程实践,使学生了解词法分析的任务,掌握词法分析程序设计的原理和构造方法,使学生对编译的基本概念、原理和方法有完整的和清楚的理解,并能正确地、熟练地运用。 二、实验内容 用VC+/VB/JAVA语言实现对C语言子集的源程序进行词法分析。通过输入源程序从左到右对字符串进行扫描和分解,依次输出各个单词的内部编码及单词符号自身值;若遇到错误则显示“Error”,然后跳过错误部分继续显示 ;同时进行标识符登记符号表的管理。 以下是实现词法分析设计的主要工作: 从源程序文件中读入字符。 统计行数和列数用于错误单词的定位。 删除空

2、格类字符,包括回车、制表符空格。 按拼写单词,并用二元式表示。(属性值token的机内表示) 如果发现错误则报告出错 根据需要是否填写标识符表供以后各阶段使用。 单词的基本分类: u 关键字:由程序语言定义的具有固定意义的标识符。也称为保留字例如 if、 for、while、printf ; 单词种别码为1。 u u u u u 标识符:用以表示各种名字,如变量名、数组名、函数名; 常数: 任何数值常数。如 125, 1,0.5,3.1416; 运算符:+、-、*、/; 关系运算符: 、=、; 分界符: ;、,、; 三、词法分析实验设计思想及算法 1、主程序设计考虑: u 程序的说明部分为各种

3、表格和变量安排空间。 在具体实现时,将各类单词设计成结构和长度均相同的形式,较短的关键字后面补空。 k数组-关键字表,每个数组元素存放一个关键字。 s 数组-存放分界符表。为了简单起见,分界符、算术运算符和关系运算符都放在s表中,合并成一类。 id 和ci 数组分别存放标识符和常数。 instring 数组为输入源程序的单词缓存。 outtoken 记录为输出内部表示缓存。 还有一些为造表填表设置的变量。 u 表。 u 主程序的工作部分设计成便于调试的循环结构。每个循环处理一个单词;主程序开始后,先以人工方式输入关键字,造k表;再输入分界符等造 p 接收键盘上送来的一个单词;调用词法分析过程;

4、输出每个单词的内部码。 例如,把每一单词设计成如下形式: (type,pointer) 其中type指明单词的种类,例如:Pointer指向本单词存放处的开始位置。 还有一些为造表填表设置的变量。 u 表。 u 主程序的工作部分设计成便于调试的循环结构。每个循环处理一个单词;主程序开始后,先以人工方式输入关键字,造k表;再输入分界符等造 p 接收键盘上送来的一个单词;调用词法分析过程;输出每个单词的内部码。 1 例如,把每一单词设计成如下形式: (type,pointer) 其中type指明单词的种类,例如:Pointer指向本单词存放处的开始位置。 2 词法分析设计流程图 2、词法分析过程考

5、虑 u 根据输入单词的第一个字符, 判断单词类,产生类号:以字符k表示关键字;id表示标识符; ci表示常数;s 表示分界符。 u 对于标识符和常数,需分别与标识符表和常数表中已登记的元素相比较,如表中已有该元素,则记录其在表中的位置,如未出现过,将标识符按顺序填入数组 id 中,将常数变为二进制形式存入数组中 ci 中,并记录其在表中的位置。 lexical 过程中嵌有两个小过程:一个名为 getchar,其功能为从 instring 中按顺序取出一个字符,并将其指针 pint 加 1 ;另一个名为 error,当出现错误时,调用这个过程,输出错误编号。 u 要求:所有识别出的单词都用两个字

6、节的等长表示,称为内部码。第一个字节为 t ,第二个字节为 i 。 t 为单词的种类。关键字的 t=;分界符的 t=;算术运算符的 t=;关系运算符的 t=;无符号数的 t=;标识符的 t=。i 为该单词在各自表中的指针或内部码值。表 1 为关键字表;表 2 为3 分界符表;表 3 为算术运算符的 i 值;表 4 为关系运算符的 i 值。 4 取字符和统计字符行列位置子程序 四、实验要求 1、编程时注意编程风格:空行的使用、注释的使用、缩进的使用等。 2、将标识符填写的相应符号表须提供给编译程序的以后各阶段使用。 3、根据测试数据进行测试。测试实例应包括以下三个部分: u 全部合法的输入。 u

7、 各种组合的非法输入。 u 由记号组成的句子。 4、词法分析程序设计要求输出形式: 例:输入VC+语言的实例程序: If i=0 then n+; a= 3b %); 输出形式为: 单词 二元序列 类 型 位置 for (1,for ) 关键字 i ( 6,i ) 标识符 = ( 4,= ) 关系运算符 5 0 ( 5,0 ) 常数 then ( 1,then) 关键字 n (6,n ) 标识符 + Error Error ; ( 2, ; ) 分界符 a (6,a ) 标识符 = (4,= ) 关系运算符 3b Error Error % Error Error ) ( 2, ) ) 分界符

8、 ; ( 2, ; ) 分界符 五、实验步骤 1、根据流程图编写出各个模块的源程序代码上机调试。 2、 编制好源程序后,设计若干用例对系统进行全面的上机测试,并通过所设计的词法分析程序;直至能够得到完全满意的结果。 六、程序源代码 1、词法分析器操作类 package 词法分析器; public class compiler public String computerComp(String str) String output=; int index=0; while(index|str.charAt(index)=str.length) return output; /数字 else if

9、(isMath(str.charAt(index) int index1=index; output+=(); 8 while(isMath(str.charAt(index) output+=(str.charAt(index); index+; if(index=str.length) return output; if(isLetter(str.charAt(index) while(!isMath(str.charAt(index) (isLetter(str.charAt(index) output+=(str.charAt(index); index+; if(index=str.

10、length) return output; output+=(,非法字符); else if(str.charAt(index1)=0) if(isMath(str.charAt(index1+1) output+=(,非法字符); else output+=(,数字,); else output+=(,数字,); /字母判断 else if(isLetter(str.charAt(index) 9 & int i=index; while(isLetter(str.charAt(index)|isMath(str.charAt(index) /判断是不是关键字 public boolean

11、 isKeyword(String str) boolean flag=true; String return output; /空格或者回车处理 else index+; String sub =str.substring(i, index); /判断是是不是关键字 if(isKeyword(sub) output+=(关键字,+sub+); if(index=str.length) return output; index+; else output+=(标识符,+sub+); arr=public,static,void,main,String,int,boolean,private,i

12、f,else,while ; 10 for(int i=0;i=a&charr=A&charr=0)&(charr=9) return true; else return false; /判断是不是界符得方法 public boolean isJieFu(char charr) char arr=,;,; for(int i=0;iarr.length;i+) if (charr=arri) return true; 11 return false; /判断是不是运算符得方法 public boolean isCompu(char charr) boolean flag=false; char

13、 arr=,+,-,*,!,/,%; for(int i=0;iTG G-+TG|TG G- T-FS S-*FS|/FS S- F-(E) F-i 输出的格式如下: 17 五、实验步骤 1、根据流程图编写出各个模块的源程序代码上机调试。 2、 编制好源程序后,设计若干用例对系统进行全面的上机测试,并通过所设计的LL(1)分析程序;直至能够得到完全满意的结果。 六、程序源代码 1、操作类 package test2; public class LL1_Opertion private char strChar;/ 输入串 private char stack = new char1000;/

14、分析栈 private int top = 0;/ 分析栈指针 18 private int strPointer = 0;/ 输入串指针 private int length;/ 输入串长度 private String analysisTable = new String69;/ 分析表 private final char constChar = i, (, +, -, *, /, ), # ;/ 常字符 private String dataStrings = new String10005;/ 结果数据表 /* * 规则 i ( + - * / ) # E E-TG E-TG syn

15、ch synch G G-+TG private String tempString = new String;/ 临时字符串 private String result = new String;/ 得出的结果字符串 private int dataRow = 0;/ 数据表行数 G-TG G- G- T * T-FS T-FS synch synch synch synch S S- S- S-*FS S-/FS S- S- F * F-i F-(E) synch synch synch synch synch synch */ public LL1_Opertion / 初始化各个参数

16、for (int i = 0; i 6; i+) 19 for (int j = 0; j 9; j+) analysisTableij = new String; analysisTableij = ; for (int i = 0; i 1000; i+) for (int j = 0; j 5; j+) dataStringsij = new String; dataStringsij = ; analysisTable01 = i; analysisTable02 = (; analysisTable03 = +; analysisTable04 = -; analysisTable0

17、5 = *; analysisTable06 = /; analysisTable07 = ); analysisTable08 = #; analysisTable10 = E; analysisTable20 = G; analysisTable30 = T; analysisTable40 = S; analysisTable50 = F; analysisTable11 = TG; analysisTable12 = TG; analysisTable23 = +TG; analysisTable24 = -TG; analysisTable27 = ;analysisTable28

18、= ;analysisTable31 = FS; analysisTable32 = FS; analysisTable43 = ;analysisTable44 = ;analysisTable45 = *FS; 20 analysisTable46 = /FS; analysisTable47 = ; analysisTable48 = ; analysisTable51 = i; analysisTable52 = (E); stacktop = #; stack+top = E; public boolean checkChar(char needCheck) / 在字符表中 for

19、(int i = 0; i constChar.length; i+) if (needCheck = constChari) return true; return false; public void printStack / 输出分析栈 this.tempString = new String; for (int i = 0; i top + 1; i+) this.tempString += stacki; System.out.print(stacki); result += stacki; System.out.print(tt); result += tt; 21 检查字符是否p

20、ublic void analysis(String line) / LL(1)分析 strChar = line.toCharArray; length = strChar.length; String analysisString = new String; char ch = strCharstrPointer; char topX; int finish = 0, flag = 0; int row = 0, column = 0; System.out.print(步骤tt分析栈 tt剩余字符 tt所用产public void printStr / 输出剩余输入串 this.temp

21、String = new String; for (int i = 0; i strPointer; i+) for (int i = strPointer; i length; i+) System.out.print(ttt); result += ttt; this.tempString += strChari; System.out.print(strChari); result += strChari; System.out.print( ); result += ; 生式 tt动作n); result += 步骤tt分析栈 tt剩余字符 tt所用产生式 tt动作rn; 22 dat

22、aStrings00 = dataRow+ + ; System.out.print(dataRow + tt); result += dataRow + tt; printStack; dataStrings01 = tempString; printStr; dataStrings02 = tempString; dataStrings04 = 初始化; result += tt初始化rn; System.out.print(n); do topX = stacktop-; dataStringsdataRow0 = dataRow + ; System.out.print(dataRow

23、 + tt); result += dataRow + tt; for (int i = 0; i 9; i+) / 判断是否为非终结符 if (flag = 1) / 如果是终结符 if (topX = #) 23 if (checkChar(topX) flag = 1; break; finish = 1; System.out.println(over); result += overrn; break; if (topX = ch) printStack; dataStringsdataRow1 = tempString; ch = strChar+strPointer; print

24、Str; dataStringsdataRow2 = tempString; System.out.print(匹配n); dataStringsdataRow4 = GETNEXT(I); result += ttGETNEXT(I)rn; flag = 0; this.dataRow+; else printStack; dataStringsdataRow1 = tempString; printStr; dataStringsdataRow2 = tempString; System.out.print(错误n); result += tt错误rn; this.dataRow+; br

25、eak; else for (int i = 0; i 6; i+) if (topX = analysisTablei0.charAt(0) row = i; break; for (int i = 0; i = 0; i-) stack+top = analysisString.charAt(i); printStack; dataStringsdataRow1 = tempString; printStr; dataStringsdataRow2 = tempString; System.out.print(analysisTablerow0 + - + analysisString +

26、 n); dataStringsdataRow3 = analysisTablerow0 + - + analysisString; result += analysisTablerow0 + - + analysisString; if (!analysisString.equals() dataStringsdataRow4 = POP,PUSH( + analysisString + ); 25 result += ttPOP,PUSH( + analysisString + )rn; else dataStringsdataRow4 = POP; result += ttPOPrn; if (stacktop = ) top-; this.dataRow+; else

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号