合肥工业大学编译原理实验
编译原理实验报告:实验一编写词法分析程序.
![编译原理实验报告:实验一编写词法分析程序.](https://img.taocdn.com/s3/m/516a48af680203d8ce2f24b6.png)
编译原理实验报告实验名称:实验一编写词法分析程序实验类型:验证型实验指导教师:何中胜专业班级:13软件四姓名:丁越学号:13030504电子邮箱:862245792@实验地点:秋白楼B720实验成绩:日期:2016年3 月18 日一、实验目的通过设计、调试词法分析程序,实现从源程序中分出各种单词的方法;熟悉词法分析程序所用的工具自动机,进一步理解自动机理论。
掌握文法转换成自动机的技术及有穷自动机实现的方法。
确定词法分析器的输出形式及标识符与关键字的区分方法。
加深对课堂教学的理解;提高词法分析方法的实践能力。
通过本实验,应达到以下目标:1、掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法。
2、掌握词法分析的实现方法。
3、上机调试编出的词法分析程序。
二、实验过程以编写PASCAL子集的词法分析程序为例1.理论部分(1)主程序设计考虑主程序的说明部分为各种表格和变量安排空间。
数组 k为关键字表,每个数组元素存放一个关键字。
采用定长的方式,较短的关键字后面补空格。
P数组存放分界符。
为了简单起见,分界符、算术运算符和关系运算符都放在 p表中(编程时,还应建立算术运算符表和关系运算符表,并且各有类号),合并成一类。
id和ci数组分别存放标识符和常数。
instring数组为输入源程序的单词缓存。
outtoken记录为输出内部表示缓存。
还有一些为造表填表设置的变量。
主程序开始后,先以人工方式输入关键字,造 k表;再输入分界符等造p表。
主程序的工作部分设计成便于调试的循环结构。
每个循环处理一个单词;接收键盘上送来的一个单词;调用词法分析过程;输出每个单词的内部码。
⑵词法分析过程考虑将词法分析程序设计成独立一遍扫描源程序的结构。
其流程图见图1-1。
图1-1该过程取名为 lexical,它根据输入单词的第一个字符(有时还需读第二个字符),判断单词类,产生类号:以字符 k表示关键字;i表示标识符;c表示常数;p表示分界符;s表示运算符(编程时类号分别为 1,2,3,4,5)。
编译原理实验报告
![编译原理实验报告](https://img.taocdn.com/s3/m/7bd0e2317f21af45b307e87101f69e314332faa0.png)
编译原理实验报告一、实验目的编译原理是计算机科学中的重要学科,它涉及到将高级编程语言转换为计算机能够理解和执行的机器语言。
本次实验的目的是通过实际操作和编程实践,深入理解编译原理中的词法分析、语法分析、语义分析以及中间代码生成等关键环节,提高我们对编译过程的认识和编程能力。
二、实验环境本次实验使用的编程语言为C++,开发环境为Visual Studio 2019。
此外,还使用了一些相关的编译工具和调试工具,如 GDB 等。
三、实验内容(一)词法分析器的实现词法分析是编译过程的第一步,其任务是将输入的源程序分解为一个个单词符号。
在本次实验中,我们使用有限自动机的理论来设计和实现词法分析器。
首先,定义了各种单词符号的类别,如标识符、关键字、常量、运算符等。
然后,根据这些类别设计了相应的状态转换图,并将其转换为代码实现。
在实现过程中,使用了正则表达式来匹配输入字符串中的单词符号。
对于标识符和常量等需要进一步处理的单词符号,使用了相应的规则进行解析和转换。
(二)语法分析器的实现语法分析是编译过程的核心环节之一,其任务是根据给定的语法规则,分析输入的单词符号序列是否符合语法结构。
在本次实验中,我们使用了递归下降的语法分析方法。
首先,根据实验要求定义了语法规则,并将其转换为相应的递归函数。
在递归函数中,通过对输入单词符号的判断和处理,逐步分析语法结构。
为了处理语法错误,在分析过程中添加了错误检测和处理机制。
当遇到不符合语法规则的输入时,能够输出相应的错误信息,并尝试进行恢复。
(三)语义分析及中间代码生成语义分析的目的是对语法分析得到的语法树进行语义检查和语义处理,生成中间代码。
在本次实验中,我们使用了三地址码作为中间代码的表示形式。
在语义分析过程中,对变量的定义和使用、表达式的计算、控制流语句等进行了语义检查和处理。
对于符合语义规则的语法结构,生成相应的三地址码指令。
四、实验步骤(一)词法分析器的实现步骤1、定义单词符号的类别和对应的正则表达式。
编译原理课程设计
![编译原理课程设计](https://img.taocdn.com/s3/m/3b8b7028b4daa58da0114aaa.png)
课 程 设 计将算术表达式转换成四元式的程序实现 康海潇20062421计算机科学与技术2班 王仲宾2008 年 12 月设计题目 学 号 专业班级 学生姓名指导教师合肥工业大学课程设计任务书目录第一章概述 (4)1.1设计内容 (4)1.2设计要求 (4)第二章设计的基本原理 (4)第三章程序设计 (6)3.1总体方案设计 (6)3.2各模块设计 (6)第四章程序测试 (7)...第五章结论 (7)附录程序清单 (8)第一章概述1.1设计内容:设计一个语法制导翻译器,将算术表达式翻译成四元式。
1.2设计要求:先确定一个定义算术表达式的文法,为其设计一个语法分析程序,为每条产生式配备一个语义子程序,按照一遍扫描的语法制导翻译方法,实现翻译程序。
对用户输入的任意一个正确的算术表达式,程序将其转换成四元式输出(可按一定格式输出到指定文件中)。
第二章设计的基本原理四元式是一个带有四个域的记录结构,这四个域分别成为op,arg1,arg2及result。
域op包含一个代表运算符的内部码。
三地址语句x:=y op z可表示为:将y置于arg1域,z置于arg2域,x置于result域,:=为算符。
带有一元运算符的语句如x:=-y或x:=y的表示中不用arg2.而像param这样的运算符仅使用arg1域。
条件及无条件转移语句将目标标号置于result域中。
赋值语句a:=b*-c+b*-c的四元式表示为:op arg1 arg2 result(0) uminus c _ T1(1) * b T1 T2(2) uminus c _ T3(3) * b T3 T4(4) + T2 T4 T5(5) := T5 _ a通常四元式的arg1,arg2 和result 的内容都是一个指针,此指针指向有关名字的符号表入口。
这样临时变量名也要填入符合表。
本程序用c++语言编写,用一个string类型的数据存储读入的式子,由于要求读入算术表达式,所以输入为标准的算术表达式,如有负值则必须用括号括起来,格式如下:x=a+c×(e×(-d)).所用到的产生式为:E->E+E|E*E|E-E|E/E|(E)|(F)|i|ε;F->-i;通过这个产生式可以得到任意一个算术表达式。
Removed_合肥工业大学编译原理实验 LL(1)分析法
![Removed_合肥工业大学编译原理实验 LL(1)分析法](https://img.taocdn.com/s3/m/0d24059490c69ec3d4bb752e.png)
if(c==Vt[i])return i;//在表中,就返回位置 } return -1;//返回-1 表示不在表中 } void addfi(String s, int j){//求关于某一个产生式的 first 集 int v=vn(s.charAt(0));//v 为产生式左边的非终结符 int i; if(vt(s.charAt(j))!=-1){//产生式右边第一个为终结符
fi[v][vt(s.charAt(j))]=true;//就把 s.charAt(j)加入 s.charAt(0)的 first 集
}else{//产生式右边第一个为非终结符 if(!fi[vn(s.charAt(j))][Vt.length]){//如果 s.charAt(j)的
first 集没有求,先求 s.charAt(j)的 first 集 first(s.charAt(j));
int vn(char c){//返回 c 在非终结符表中的位置 int i; for(i=0;i<Vn.length;i++){ if(c==Vn[i])return i;//在表中,就返回位置 } return -1;//返回-1 表示不在表中
} int vt(char c){//返回 c 在终结符表中的位置
4、算法流程图
:50 45. 44. 43. by 42.41.— 4—0.— 3—9.—3—8.by37@.—— 36.35. —34—. ——33.312. 1.2.3.34.0.5.6—.—29.by28.by@27.26.—— 25. 24. 23. 22. by 21.20. — 1—9.by:18.by:17.— 1—6.— 1—5.—1—4.—— 13. 12. 111.0“. ”by: 9M.“OOOKN”b8y.:——7.——6.——5.——4.——3.——2.——1.——
编译原理:第一章 引论
![编译原理:第一章 引论](https://img.taocdn.com/s3/m/80504ae16294dd88d0d26b8b.png)
常见的表格:符号名表,常数表,标号表,入 口名表,过程引用表。 格式:
名字
信息
合肥工业大学 计算机与信息学院软件所
例: PASCAL程序段:
PROCEDURE INCWAP(M,N:INTEGER); LABEL START; VAR K:INTEGER; BEGIN START: K:=M+1; M:=N+4; N:=K; END.
合肥工业大学 计算机与信息学院软件所
5. 目标代码产生
任务: 把中间代码变换成特定机器上的目标 代码。 依赖于硬件系统结构和机器指令的含义 目标代码三种形式:
绝对指令代码: 可直接运行 可重新定位指令代码: 需要连接装配 汇编指令代码: 需要进行汇编
合肥工业大学 计算机与信息学院软件所
合肥工业大学 计算机与信息学院软件所
4. 优化
任务:对于前阶段产生的中间代码进行加工变 换,以期在最后阶段产生更高效的目标代码。 主要包括:公共子表达式提取、合并已知量、 删除无用语句、循环优化等。 依循的原则:程序的等价变换规则
FOR K:=1 TO 100 DO BEGIN X:=I+1; M := I + 10 * K; N := J + 10 * K; END
合肥工业大学 计算机与信息学院软件所
语法分析举例说明
C语言程序 Void jisuan() { int y,c,d; float x,a,b; x=a+b*50; y=c+)d*(x+b; } 现在我们对x=a+b*50; 进行语 法分析。
赋值语句的语法 规则: A V=E E T|E+T T F|T*F F V|(E)|C V 标识符 C 常数
合肥工业大学编译原理实验
![合肥工业大学编译原理实验](https://img.taocdn.com/s3/m/21da8986192e45361166f5a7.png)
宣城校区实验报告课程名称编译原理专业班级计算机0001班学生姓名及学号赵保飞 68指导教师李芒宏实验地点计算机中心楼第四机房2017 ~2018 学年第一学期《编译原理》课程实验报告实验名称词法分析设计姓名赵保飞系院专业计算机科学与技术班级计算机01班学号68实验日期指导教师李芒宏成绩一、实验目的和要求通过本实验的编程实践,使学生了解词法分析的任务,掌握词法分析程序设计的原理和构造方法,使学生对编译的基本概念、原理和方法有完整的和清楚的理解,并能正确地、熟练地运用。
二、实验原理(1)实验数据结构说明K[]String数组-关键字表;s[]char数组—分界符;m[]char数组—算术运算符;r[]String数组—关系运算符;ArrayList型String数组ci—常数;ArrayList型String数组id—标识符(2)实验算法描述(3)算法流程图三、源程序代码和测试结果package lexicalAnalysis;import.*;import.*;public class lexicalAnalysis{static Stringk[]={"for","main","if","while","void","public","static","printf","scanf","asm","do","return","typedef","auto","double","break", "short","using","default","long"};ength()==1){quals(b))){display(4,r[i],' ');ength()==2){quals(a))){display(4,r[i],' ');;import.*;import WinGrid extends JFrame{GridLayout grid;JPanel chessboard;JTextField text;JTextArea textShow;JButton button;ReaderListen listener;WinGrid(){init();setVisible(true);setDefaultCloseOperation;}void init(){setLayout(new FlowLayout());text=new JTextField(10);setBounds(466,166,500,400);button=new JButton("读取");textShow=new JTextArea(9,30);listener=new ReaderListen();(text);(textShow);(listener);(listener);add(text);add(button);add(new JScrollPane(textShow));}}class ReaderListen implements ActionListener{JTextField text;JTextArea textShow;LL one=new LL();String s;String temp1[][]=new String[18][6];public void setJTextField(JTextField text){=text;}public void setJTextArea(JTextArea textShow){=textShow;}public String S(){String t=();return t;}@Overridepublic void actionPerformed(ActionEvent e){try{String s=()+"#";(s+"\n");("步骤"+"\t"+"分析栈"+"\t"+"剩余输入串"+"\t"+"所用产生式"+"\t"+"动作"+"\n");(s,temp1);for(int i=0;i<18;i++){for(int k=0;k<5;k++){(temp1[i][k]+"\t");}("\n");}}catch(Exception e2){();}}}public class exp3{public static void main(String[]args){;import.*;public class LL{char Vn[]={'E','T','G','F','S'};harAt(0);int k;if(vtNum(Gr[i].charAt(j))!=-1){harAt(j)!='ε'){harAt(j)不为ε时将s加到M[vn(u)][vt(Gr[i].charAt(j))]中M[vnNum(u)][vtNum(Gr[i].charAt(j))]=s;}else{harAt(j)为ε,将属于u的follow集的元素b的位置用s加到M[vn(u)][vt(b)]中if(FOLLOW[vnNum(u)][k]){M[vnNum(u)][k]=s;}}}}else{harAt(j)为非终结符for(k=0;k<;k++){harAt(j)的first集时,将s加到M[vn(u)][vt(a)]中if(FIRST[vnNum(Gr[i].charAt(j))][k]){M[vnNum(u)][k]=s;}}if(FIRST[vnNum(Gr[i].charAt(j))][vtNum('ε')]){harAt(j)的first集时,将属于u的follow集的b将s加到M[vn(u)][vt(b)]中if(j==m-1){for(k=0;k<;k++){if(FOLLOW[vnNum(u)][k])M[vnNum(u)][k]=s;}}else{j=j+1;MM(j,i,s,m);}}}}void buildM(){ength()){m=or(j,Gr[i]);if(m==-1){m=Gr[i].length();}s=Gr[i].substring(j,m);oString());}tempp[k][1]=temp0_string;tempp[k][2]=(i); tempp[k][3]=rule; tempp[k][4]=();v=();action="pop";if(vnNum(v)!=-1){left = 'E';strcpy(s_have[1].sright, "E+T");left = 'E';strcpy(s_have[2].sright, "T");left = 'T';strcpy(s_have[3].sright, "T*F");left = 'T';strcpy(s_have[4].sright, "F");left = 'F';strcpy(s_have[5].sright, "(E)");left = 'F';strcpy(s_have[6].sright, "i");ove[0] = 5;action[0].move[3] = 4;action[1].move[1] = 6;action[2].change[1] = 2;action[2].move[2] = 7;action[2].change[4] = 2;action[2].change[5] = 2;action[3].change[1] = 4;action[3].change[2] = 4;action[3].change[4] = 4;action[3].change[5] = 4;action[4].move[1] = 5;action[4].move[3] = 4;action[5].change[1] = 6;action[5].change[2] = 6;action[5].change[4] = 6;action[5].change[5] = 6;action[6].move[0] = 5;action[6].move[3] = 4;action[7].move[0] = 5;action[7].move[3] = 4;action[8].change[1] = 6;action[8].change[4] = 11;action[9].change[1] = 1;action[9].move[2] = 7;action[9].change[4] = 1;action[9].change[5] = 1;action[10].change[1] = 3;action[10].change[2] = 3;action[10].change[4] = 3;action[10].change[5] = 3;action[11].change[1] = 5;action[11].change[2] = 5;action[11].change[4] = 5;action[11].change[5] = 5;/*存储GOTO表*/go[0].head[0] = 'E';ead[1] = 'T';go[0].head[2] = 'F';go[0].gt[0] = 1;t[1] = 2;go[0].gt[2] = 3;go[4].head[0] = 'E';go[4].head[1] = 'T';go[4].head[2] = 'F';go[4].gt[0] = 8;go[4].gt[1] = 2;go[4].gt[2] = 3;go[6].head[1] = 'T';go[6].head[2] = 'F';go[6].gt[1] = 9;go[6].gt[2] = 3;go[7].head[2] = 'F';go[7].gt[2] = 10;ove[col] != 0){cout << "ACTION[" << sta << "," << symb << "]=" << "S" << action[sta].move[col] << ",PUSH" << action[sta].move[col] << endl;status[++sta_Index] = action[sta].move[col];hange[col] != 0){cout << "r" << action[sta].change[col] << ":" << s_have[action[sta].change[col]].sleft << "->"<< s_have[action[sta].change[col]].sright << "规约,GOTO(" << status[sta_Index - strlen(s_have[action[sta].change[col]].sright)] << ","<< s_have[action[sta].change[col]].sleft << ")=";int i = 0;for (i = 0; i < strlen(s_have[action[sta].change[col]].sright); i++)hange[col]].sleft;hange[col]].sright); i++)ead[i] == symb){status[++sta_Index] = go[sta].gt[i];cout<< go[sta].gt[i] << "PUSH" << endl;return;}}}/*查表*/void start_find(void){int s = status[sta_Index];char exp_first_char = inputstring[instr_top];char sym = symbol[sym_Index];while (IsAccept != 1){s = status[sta_Index];exp_first_char = inputstring[instr_top];sym = symbol[sym_Index];/*输出步骤*/cout << step++<<"\t\t";/*输出当前状态栈*/int i = 0;for (i = 0; i <= sta_Index; i++){cout<<status[i];}cout << "\t\t";/*输出符号栈*/cout << symbol << "\t\t";/*输出剩余的输入串*/i= 0;for (i = 0; i < instr_top; i++)cout<<" ";for (i = instr_top; i <= instr_index; i++){cout<<inputstring[i];}cout<<"\t\t";switch (exp_first_char){case 'i':find_table(s, exp_first_char, 0);break;case '+':find_table(s, exp_first_char, 1);break;case '*':find_table(s, exp_first_char, 2);break;case '(':find_table(s, exp_first_char, 3);break;case ')':find_table(s, exp_first_char, 4);break;case '#':find_table(s, exp_first_char, 5);break;}}}int main(){//cout << "输入要判断的分析串:";string temp;cin >> temp;for (int i = 0;i < ();i++)inputstring[i] = temp[i];inputstring[()] = '#';instr_index = () + 1;Initlize();cout << "步骤\t\t 状态栈\t符号栈\t 输入串\t 动作\n";start_find();return 0;}四、实验评价、收获与体会这一周真是惊险万分,有周二四个小时OS实验,周三网络考试,周三就要验收实验,还有一堆事好像老师都喜欢集体行动把事情堆到一起解决。
合肥工业大学编译原理实验报告(完整代码版)
![合肥工业大学编译原理实验报告(完整代码版)](https://img.taocdn.com/s3/m/30656140b84ae45c3b358ca7.png)
计算机与信息学院编译原理实验报告专业班级信息安全13-1班学生姓名及学号马骏 2013211869 课程教学班号任课教师李宏芒实验指导教师李宏芒实验地点实验楼机房2015 ~2016 学年第二学期实验1 词法分析设计一、实验目的通过本实验的编程实践,使学生了解词法分析的任务,掌握词法分析程序设计的原理和构造方法,使学生对编译的基本概念、原理和方法有完整的和清楚的理解,并能正确地、熟练地运用二、实验要求1、编程时注意编程风格:空行的使用、注释的使用、缩进的使用等。
2、将标识符填写的相应符号表须提供给编译程序的以后各阶段使用。
3、根据测试数据进行测试。
测试实例应包括以下三个部分:全部合法的输入。
各种组合的非法输入。
由记号组成的句子。
4、词法分析程序设计要求输出形式:例:输入VC++语言的实例程序:If i=0 then n++;a﹤= 3b %);输出形式为:单词二元序列类型位置(行,列)(单词种别,单词属性)for (1,for ) 关键字(1,1)i ( 6,i ) 标识符(1,2)= ( 4,= ) 关系运算符(1,3)120 ( 5,0 ) 常数(1,4)then ( 1,then) 关键字(1,5)n (6,n ) 标识符(1,6)++ Error Error (1,7);( 2, ; ) 分界符(1,8)a (6,a ) 标识符(2,1)﹤= (4,<= ) 关系运算符(2,2)3b Error Error (2,4)% Error Error (2,4)) ( 2, ) ) 分界符(2,5);( 2, ; ) 分界符(2,6)三、实验内容用VC++/VB/JA V A 语言实现对 C 语言子集的源程序进行词法分析。
通过输入源程序从左到右对字符串进行扫描和分解,依次输出各个单词的内部编码及单词符号自身值;若遇到错误则显示“Error”,然后跳过错误部分继续显示;同时进行标识符登记符号表的管理。
编译原理实验指导书(-).docx
![编译原理实验指导书(-).docx](https://img.taocdn.com/s3/m/923b29cc6c175f0e7dd13796.png)
编译原理实验指导书合肥学院计算编译原理实验指导书实验一词法分析一、实验目的:通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。
并掌握在对程序设计语言源程序进行扫描过程屮将其分解为各类单词的词法分析方法。
编制一个读单词过程,从输入的源程序中,识別出各个具有独立意义的单词, 即基木保留字、标识符、常数、运算符、分隔符五大类。
并依次输出各个单词的内部编码及单词符号自身值。
(遇到错误时可显示“Error”,然后跳过错误部分继续显示)二、实验预习提示1、词法分析器的功能和输出格式词法分析器的功能是输入源程序,输出单词符号。
词法分析器的单词符号常常农示成以下的二元式(单词种别码,单词符号的属性值)。
本实验中,采用的是一类符号一种别码的方式。
2、单词的BNF表示<标识符> -V字母〉v字母数字串〉V字母数字串一V字母〉V字母数字串>|v数字〉V字母数字串〉Iv下划线>v字母数字串I e<无符号整数一V数字〉v数字串〉V数字串〉一V数字〉V数字串〉v加法运算符>-+<减法运算符〉->・V大于关系运算符>->>V大于等于关系运算符>-> =3、“超前搜索”方法词法分析时,常常会用到超前搜索方法。
如当前待分析字符串为“”,当前字符为此时,分析器倒底是将其分析为犬于关系运算符还是犬于等于关系运算符呢?显然,只有知道下一个字符是什么才能下结论。
超前读了一个字符所以要回退一个字符,词法分析器才能正常运行。
在分析标识符,无符号整数等时也有类似情况。
4、模块结构Y饗冲区扫播一个辛閒N ▼三、实验过程和指导:(-)准备:1・阅读课木有关章节,明确语言的语法,写出基木保留字、标识符、常'数、运算符、分隔符和程序例。
2 .初步编制好程序。
3•准备好多组测试数据。
(二)上课上机: 将源代码拷贝到机上调试,发现错误,再修改完善。
第二次上机调试通过。
(三)程序要求:程序输入/输出示例:如源程序为C语言。
输入如卜•一段:main(){int a,b;a = 1 0;b = a 4- 20;}要求输出如下图。
合肥工业大学编译原理课程设计
![合肥工业大学编译原理课程设计](https://img.taocdn.com/s3/m/d0ed7a178bd63186bcebbcfe.png)
关于《编译原理》课程设计的有关说明《编译原理》是计算机专业的一门重要的专业课程,其中包含大量软件设计思想。
大家通过课程设计,实现一些重要的算法,或设计一个完整的编译程序模型,能够进一步加深理解和掌握所学知识,对提高自己的软件设计水平具有十分重要的意义。
大家在进行课程设计时,可从所学内容中选择某个主题,抽象成一个模型,可适当进行简化。
也可按提供给大家的一些参考选题进行设计。
软件开发选择C/C++语言(也可以是你熟悉的任何语言)。
最后每位同学都要认真撰写设计报告,格式要规范,内容要详尽,包括:设计题目,设计目的,设计内容,设计要求,问题的描述及解决的方法、原理、思想、算法(流程图),设计的输入和输出形式,测试、模拟的结果(屏幕拷贝、生成结果的打印输出),总结(体会),源程序清单,等等。
大家应把该门课的课程设计当成对自己学习效果的一次检验,当成是为在大四能够顺利完成毕业设计的一次基本功训练。
希望每个同学尽可能不要都选择完全一样的题目。
大家可以自主选题,或选择我提供的题目,也可以把几个题目合起来做(如开发一个小的编译器)。
鼓励选择有一定技术难度、有一定工作量、综合性较强的题目,在评定成绩时将会给予好的成绩。
编译原理课程设计部分参考选题:1.题目: FORTRAN语言实型常数识别程序设计设计内容及要求:将教材P.41的图3.2(d)识别FORTRAN实型常数的状态转换图用程序实现。
程序能够从用户输入的任意一个字符串中识别出FORTRAN实型常数,显示输出。
2.题目:简化的FORTRAN语言词法分析程序设计设计内容及要求:将教材P.42上的表3.1的词法分析器构造出来,限制条件如教材所述。
保留字的识别按标识符一样识别,通过查找保留字表区分是保留字还是标识符。
程序能够从用户输入的源程序中,识别出的单词符号,并用二元式表示,显示输出或输出到文件中。
3.题目:ε-CLOSURE(I)构造算法的程序实现设计内容及要求:将ε-CLOSURE(I)构造算法用程序实现。
递归下降分析程序的实现——合肥工业大学编译原理课程设计报告
![递归下降分析程序的实现——合肥工业大学编译原理课程设计报告](https://img.taocdn.com/s3/m/3ef971936bec0975f465e2c7.png)
课程设计报告设计题目17.递归下降分析程序的实现设计要求对文法 G:E→E+T|TT→T*F|FF→(E)|i构造出G的递归下降分析程序。
程序显示输出匹配过程(即自上而下生成语法分析树的步骤,输出各匹配产生式序号即可)。
设计思路(1)分析a) ∵E=>E+T=>E+T*F=>E+T*(E)即有E=>E+T*(E)存在左递归。
用直接改写法消除左递归,得到如下:E →TE’E’ →+TE’ | −TE’|εT →FT’T’ →*FT’ | /FT’|εF → (E) | ib) 对于以上改进的方法。
可得:对于E’:FIRST( E’ )=FIRST(+TE’)∪FIRST(-TE’)∪{ε}={+,−,ε} 对于T’:FIRST( T’ )=FIRST(*FT’)∪FIRST(/FT’)∪{ε}={*,∕,ε}而且:FIRST( E ) = FIRST( T ) = FIRST( F )=FIRST((E))∪FIRST(i)={(,i }由此得出各非终结符的FOLLOW集合如下:FOLLOW( E )= { ),#}FOLLOW(E’)= FOLLOW(E)={ ),#}FOLLOW( T )= FIRST(E’)\ε∪FOLLOW(E’)={+,−,),#}FOLLOW( T’ ) = FOLLOW( T ) ={+,−,),#}FOLLOW( F )=FIRST(T’)\ε∪FOLLOW(T’)={*,∕,+,−,),#}由以上FOLLOW集可以我们可以得出SELECT集如下:对ESELECT(E→TE’)=FIRST(TE’)=FIRST(T)={ (,i }对E’SELECT(E’→+TE’)={ + }SELECT(E’→−TE’)={ − }SELECT(E’→ε)={ε,),#}对TSELECT(T→FT’)={(,i}对T’SELECT(T’→*FT’)={ * }SELECT(T’→∕FT’)={ ∕ }SELECT(T’→ε)={ε,+,−,),#}对FSELECT(F→(E) )={ ( }SELECT(F→i)={ i }∴SELECT(E’→+TE’)∩SELECT(E’→−TE’)∩SELECT(E’→ε)=ΦSE LECT(T’→*FT’)∩SELECT(T’→∕FT’)∩SELECT(T’→ε)=ΦSELECT(F→(E) )∩SELECT(F→i)= Φ由上可知,有相同左部产生式的SELECT集合的交集为空,所以文法是LL (1)文法。
安工大汇编语言实验报告
![安工大汇编语言实验报告](https://img.taocdn.com/s3/m/8217786258fafab069dc0210.png)
实验一:汇编语言运行环境及方法、简单程序设计一、程序说明本程序用来比较两个字符串string1和string2所含的字符是否相同。
若相同则显示‘Match’,否则显示‘Nomatch’。
在程序的数据段先定义两个字符串string1和string2,再定义两个字符串mess1和mess2,分别代表‘Match’和‘Nomatch’。
再代码段比较字符串string1和string2,通过比较判断是否相同。
若相同则显示‘Match’,否则显示‘Nomatch’三.程序代码datarea segmentstring1 db 'Move the cursor backward.'string2 db 'Move the cursor backward.'mess1 db 'Match.',13,10,'$'mess2 db 'No match.',13,10,'$'datarea endsprognam segmentmain proc farassume cs:prognam,ds:datarea,es:datareastart:push dssub ax,axpush axmov ax,datareamov ds,axmov es,axlea si,string1lea di,string2cldmov cx,24repz cmpsbjz matchlea dx,mess2jmp short dispmatch:lea dx,mess1disp:mov ah,9int 21hretmain endpprognam endsend start四、调试说明编译—链接—运行常用到的debug调试指令:用-g命令来用运行程序,用-u命令来显示程序,用-d 命令来查看数据段的情况,用-e或-f命令来修改需要改正的部分,用-t指令来逐步执行程序,用-r指令来查看寄存器和修改寄存器的值,-q命令用来退出debug程序。
合肥工业大学编译原理 LL自上而下文法分析
![合肥工业大学编译原理 LL自上而下文法分析](https://img.taocdn.com/s3/m/a105dd8c76a20029bd642de6.png)
例如,程序描述以下语句:
E = E + T |T
T = T * F |F
F =(E)| 0 |1
在这种情况,我们可以很容易确定E,T和F是非终端,而符号“(”,“)”,“*”和“+”和数字“0”和“1”是在终端。
第一个非终端(第一衍生物)被认为是语法的公理。
4)分析表的结构
具有非递归语法以及“第一个”和“其后”的集合,你的程序现在可以建立预测分析表。
结果以表的形式显示在屏幕上。
图注释:Construction de la table d’analyse分析表的结构
table d’analyse分析表Affichage de la table d’analyse显示分析表
4、开发过程
1)字符要求:
你的程序必须能够根据以下字符来处理语法:
-终端字符:字母,数字,符号例如“+”,“—”,…;
-非终端字母表中的大写字母。
符号“=”,“|”和“#”(替换“ε”,因为它更容易输入到文本文件)被保留用于语法的描述中,因此不能被用作终端。
2)初始状态
您的程序通过读取一个文件中的“文本”格式开始。
结果被存储在数据结构,再次“你的选择。”
然后,这些集合被显示在屏幕上
图注释:Calcul des ensembles « premiers » et « suivants »计算“第一个”和“其后”的集合
Affichage des ensembles显示集合premiers第一个suivants其后
结果必须存储在内存中,是一个您所选择的数据结构。然后,使用一个函数再取出数据,存储在内存中并屏幕上显示(以你选择的格式)。
汇编语言实验报告含代码(合肥工业大学)
![汇编语言实验报告含代码(合肥工业大学)](https://img.taocdn.com/s3/m/f951dc6327d3240c8447ef2e.png)
合肥工业大学实验报告课程:汇编语言程序设计专业班级:学号:姓名:实验一Debug程序的使用一.实验目的1、熟悉DEBUG程序中的命令,学会在DEBUG下调试运行汇编语言源程序。
2、掌握8086/8088的寻址方式及多字节数据的处理方法。
二.实验内容实验内容:1、利用DEBUG 程序中的“E”命令,将两个多字节数“12345678H”和“FEDCBA98H”分别送入起始地址为DS:0200H 和DS:0204H 两个单元中。
2 、分别用直接寻址方式和寄存器间接寻址方式编写程序段,实现将DS:0200H 单元和DS:0204H 单元中的数据相加,并将运算结果存放在DS:0208H 单元中。
实验要求:本次实验的内容均在DEBUG 下完成,实现数据的装入、修改、显示;汇编语言程序段的编辑、汇编和反汇编;程序的运行和结果检查。
三.实验过程和程序1、启动DOS 操作系统2、运行 程序(若当前盘为C)C: >DEBUG ↙–;(“–”为DEBUG 提示符,仅当屏幕出现该提示符后,才可输入DEBUG命令)3、用“A”命令编辑和汇编源程序–A ↙186E :0100 MOV AX,[0200]↙186E :0103 MOV BX,[0202]↙186E :0107 ADD AX,[0204]↙186E :010B ADC BX,[0206]↙186E :010F MOV [0208],AX ↙186E :0112 MOV [020A],BX ↙186E :0116 ↙4、用“U ”命令反汇编验证源程序–U CS:0100 ↙186E :0100 A10002 MOV AX,[0200]186E :0103 8B1E0202 MOV BX,[0202]186E :0107 03060402 ADD AX,[0204]186E :010B 131E0602 ADC BX,[0206]186E :010F A30802 MOV [0208],AX186E :0112 891E0A02 MOV [020A],BX186E :0116–注意:检查源程序是否有错误,若有则返回到第3 步用“A 地址”命令进行修改,直到程序无错误。
编译原理实验报告
![编译原理实验报告](https://img.taocdn.com/s3/m/52a5eef7f71fb7360b4c2e3f5727a5e9856a2734.png)
编译原理实验报告合工大编译原理实验报告,后面附代码,孩纸,只能参考不能抄袭哦,好好学习天天向上,编译原理实验报告合肥工业大学计算机科学与技术完成日期:20XX年.6.3实验一词法分析设计一、实验功能:合工大编译原理实验报告,后面附代码,孩纸,只能参考不能抄袭哦,好好学习天天向上,对输入的txt文件内的内容进行词法分析:由文件流输入test.txt中的内容,对文件中的各类字符进行词法分析打印出分析后的结果;二、程序结构描述:(源代码见附录)1、利用Key[]进行构造并存储关键字表;利用optr[]进行构造并存储运算符表;利用separator[]进行构造并存储分界符表;2、bool IsKey(string ss) {}判断是否是关键字函数若是关键字返回true,否则返回false;bool IsLetter(char c) {}判断当前字符是否字母,若是返回true,否则返回false;bool IsDigit(char c) {}判断当前字符是否是数字,若是返回true,否则返回false;bool IsOptr(string ss) {}判断当前字符是否是运算符,若是返回true,否则返回false;bool IsSeparator(string ss) {}判断当前字符是否是分界符,若是返回true,否则返回false;void analyse(ifstream in) {}分析函数构造;关系运算符通过switch来进行判断;三、实验结果合工大编译原理实验报告,后面附代码,孩纸,只能参考不能抄袭哦,好好学习天天向上,实验总结:词法分析的程序是自己亲手做的,在实现各个函数时花了不少功夫,1、要考虑到什么时候该退一字符,否则将会导致字符漏读甚至造成字符重复读取。
2、在实现行数和列数打印时要考虑到row++和line++应该放在什么位置上才可以,如当读取一个\n时line要增加一,而row需要归0处理,在读取某一字符串或字符后row需要加一;3、对于关系运算符用switch结构进行选择判断即可解决一个字符和两个字符的运算符之间的差异;4、将自己学过的知识应用到实践中是件不怎么容易的事情,只有亲身尝试将知识转化成程序才能避免眼高手低,对于知识的理解也必将更加深刻。
合工大(汇编)语言程序设计实验报告
![合工大(汇编)语言程序设计实验报告](https://img.taocdn.com/s3/m/2eb33db7af45b307e9719774.png)
.合肥工业大学计算机与信息学院实验报告课程:汇编语言程序设计专业班级:****************学号:**********姓名:*****目录实验一··3实验二··7实验三··12实验四··22实验一Debug程序的使用一.实验目的1、熟悉DEBUG程序中的命令,学会在DEBUG下调试运行汇编语言源程序。
2、掌握8086/8088的寻址方式及多字节数据的处理方法。
二.实验内容1、利用DEBUG程序中的“E”命令,将两个多字节数“003F1AE7H”和“006BE5C4H”分别送入起始地址为DS:0200H和DS:0204H两个单元中。
2、分别用直接寻址方式和寄存器间接寻址方式编写程序段,实现将DS:0200H 单元和DS:0204H单元中的数据相加,并将运算结果存放在DS:0208H单元中。
要求:本次实验的内容均在DEBUG下完成,实现数据的装入、修改、显示;汇编语言程序段的编辑、汇编和反汇编;程序的运行和结果检查。
三.实验过程和程序实验内容一:e ds:0200 E7 1A 3F 00e ds:0204 C4 E5 6B 00实验内容二:(1)直接寻址方式MOV AX,[0200]MOV BX,[0202]ADD AX,[0204]ADC BX,[0206]MOV [0208],AXMOV [020A],BX(2)寄存器间接寻址方式MOV SI,0200HMOV DI,0204HMOV BX,0208HMOV AX,[SI]MOV DX,[SI+2]ADD AX,[DI]ADC DX,[DI+2]MOV [BX],AXMOV [BX+2],DX四.实验结果(包括必要的截图)实验内容一:输入数据:显示数据:实验内容二:(1)直接寻址方式程序段编辑:反汇编:运行:结果在DS:0208 单元中为00AB00ABH(2)寄存器间接寻址方式程序段编辑:反汇编:运行:结果高字存放在dx中,低字存放在ax中(结果为00AB00ABh)五.实验体会通过本实验,实践debug程序中的命令,并在debug下调试运行汇编语言源程序。
合工大编译原理课程设计
![合工大编译原理课程设计](https://img.taocdn.com/s3/m/6197ec54591b6bd97f192279168884868762b88b.png)
合工大编译原理课程设计一、课程目标知识目标:1. 理解编译原理的基本概念,掌握编译程序的基本结构及工作流程;2. 掌握词法分析、语法分析、语义分析的主要方法;3. 了解代码优化和目标代码生成的基本策略。
技能目标:1. 能够运用形式语言和自动机理论对简单程序进行词法分析;2. 学会使用语法分析方法和工具对程序进行语法分析;3. 能够运用语义分析技术对程序进行语义检查;4. 能够运用所学知识编写简单的编译程序。
情感态度价值观目标:1. 培养学生对编译原理的兴趣,激发学习热情;2. 培养学生的团队协作精神,提高沟通能力;3. 培养学生严谨、细致的学术态度,提高问题分析和解决能力。
课程性质:本课程为合肥工业大学计算机科学与技术专业核心课程,旨在使学生掌握编译原理的基本知识,具备分析和设计编译程序的能力。
学生特点:学生已具备一定的编程基础和离散数学知识,具有一定的抽象思维能力。
教学要求:结合课程性质和学生特点,注重理论与实践相结合,强化学生动手实践能力,提高学生的编译程序设计与实现技能。
通过本课程的学习,使学生能够达到上述课程目标,为后续相关课程和实际工作打下坚实基础。
二、教学内容1. 编译原理概述:介绍编译程序的作用、基本结构和编译过程,使学生建立整体概念。
- 教材章节:第1章 编译概述2. 词法分析:讲解词法分析的任务、方法和实现技术,包括正则表达式、有限自动机等。
- 教材章节:第2章 词法分析3. 语法分析:介绍语法分析的方法、语法分析树和语法分析器的构造,包括LL(1)、LR(1)等分析方法。
- 教材章节:第3章 语法分析4. 语义分析:讲解语义分析的任务、属性文法和语义分析器的实现。
- 教材章节:第4章 语义分析5. 中间代码生成与优化:介绍中间代码的表示形式、生成方法以及优化策略。
- 教材章节:第5章 中间代码生成与优化6. 目标代码生成:讲解目标代码的生成方法、汇编指令的生成和代码优化。
- 教材章节:第6章 目标代码生成7. 实践环节:结合所学理论知识,设计并实现一个简单的编译程序。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
宣城校区
实验报告
课程名称编译原理
专业班级计算机0001班
学生姓名及学号赵保飞 68
指导教师李芒宏
实验地点计算机中心楼第四机房
2017 ~ 2018 学年第一学期
《编译原理》课程实验报告实验名称词法分析设计
姓名赵保飞系院专业计算机科学
与技术
班级
计算机01
班
学号68
实验日期指导教师李芒宏成绩
一、实验目的和要求
通过本实验的编程实践,使学生了解词法分析的任务,掌握词法分析程序设
计的原理和构造方法,使学生对编译的基本概念、原理和方法有完整的和清楚的
理解,并能正确地、熟练地运用。
二、实验原理
(1)实验数据结构说明
K[]String数组-关键字表;s[]char数组—分界符;m[]char数组—算术运算符;r[]String数组—关系运算符;ArrayList型String数组ci—常数;ArrayList型String数组id—标识符(2)实验算法描述
(3)算法流程图
三、源程序代码和测试结果
package lexicalAnalysis;
import.*;
import.*;
public class lexicalAnalysis{
static String
k[]={"for","main","if","while","void","public","static","printf","scanf","asm","do","return","typedef ","auto","double","break","short","using","default","long"};ength()==1){quals(b))){
display(4,r[i],' ');ength()==2){quals(a))){
display(4,r[i],' ');
;
import.*;
import WinGrid extends JFrame{
GridLayout grid;
JPanel chessboard;
JTextField text;
JTextArea textShow;
JButton button;
ReaderListen listener;
WinGrid(){
init();
setVisible(true);
setDefaultCloseOperation;
}
void init(){
setLayout(new FlowLayout());
text=new JTextField(10);
setBounds(466,166,500,400);
button=new JButton("读取");
textShow=new JTextArea(9,30);
listener=new ReaderListen();
tempp[k][1]=temp0_string; tempp[k][2]=(i);
tempp[k][3]=rule;
tempp[k][4]=();
v=();
action="pop";
if(vnNum(v)!=-1){
left = 'E';
strcpy(s_have[1].sright, "E+T");left = 'E';
strcpy(s_have[2].sright, "T");left = 'T';
strcpy(s_have[3].sright, "T*F");left = 'T';
strcpy(s_have[4].sright, "F");left = 'F';
strcpy(s_have[5].sright, "(E)");left = 'F';
strcpy(s_have[6].sright, "i");ove[0] = 5;
action[0].move[3] = 4;
action[1].move[1] = 6;
action[2].change[1] = 2;
action[2].move[2] = 7;
action[2].change[4] = 2;
action[2].change[5] = 2;
action[3].change[1] = 4;
action[3].change[2] = 4;
action[3].change[4] = 4;
action[3].change[5] = 4;
action[4].move[1] = 5;
action[4].move[3] = 4;
action[5].change[1] = 6;
action[5].change[2] = 6;
action[5].change[4] = 6;
action[5].change[5] = 6;
action[6].move[0] = 5;
action[6].move[3] = 4;
action[7].move[0] = 5;
action[7].move[3] = 4;
action[8].change[1] = 6;
action[8].change[4] = 11;
find_table(s, exp_first_char, 1);
break;
case '*':
find_table(s, exp_first_char, 2);
break;
case '(':
find_table(s, exp_first_char, 3);
break;
case ')':
find_table(s, exp_first_char, 4);
break;
case '#':
find_table(s, exp_first_char, 5);
break;
}
}
}
int main()
{
//cout << "输入要判断的分析串:";
string temp;
cin >> temp;
for (int i = 0;i < ();i++)
inputstring[i] = temp[i];
inputstring[()] = '#';
instr_index = () + 1;
Initlize();
cout << "步骤 \t\t 状态栈 \t符号栈 \t 输入串 \t 动作\n";
start_find();
return 0;
}。