编译原理实验报告 1.docx
- 文档编号:10242866
- 上传时间:2023-02-09
- 格式:DOCX
- 页数:40
- 大小:184.36KB
编译原理实验报告 1.docx
《编译原理实验报告 1.docx》由会员分享,可在线阅读,更多相关《编译原理实验报告 1.docx(40页珍藏版)》请在冰豆网上搜索。
编译原理实验报告1
编译原理实验报告
合肥工业大学计算机科学与技术
完成日期:
2015.6.13
实验一词法分析设计
一、实验功能:
对输入的txt文件内的内容进行词法分析:
由文件流输入test.txt中的内容,
对文件中的各类字符进行词法分析
打印出分析后的结果;
二、程序结构描述:
(源代码见附录)
程序用k表、s表、OP1表、OP2表等(其实是数组)存储了关键字,分界符、运算符等。
用ci和id向量存储了常数和标识符。
读取txt时使用了ifstream每次读入一个字符,根据首字符判断类型并继续读入,并利用对应的bool型函数机型判断。
在主程序中实现了对不同类型的判断和对应的输出已经报错处理。
三、实验结果
实验总结:
本次实验几乎只看最后对输入输出的要求就能做出来,是考验编程基本功和严谨程度以及对题目的理解能力的一次实验。
实验二LL
(1)分析法
一、实验原理:
1、写出LL
(1)分析法的思想:
当一个文法满足LL
(1)条件时,我们就可以为它构造一个不带回溯的自上而下的分析程序,这个分析程序是有一组递归过程组成的,每个过程对应文法的一个非终结符。
实现LL
(1)分析的一种有效的方法是使用一张分析表和一个站进行联合控制。
预测分析表是一个M[A,a]形式的矩阵,存储着分析规则;栈STACK用于存放文法符号。
从栈顶取符号,按照分析表给出的规则进行有步骤的分析。
2.实验要求实现的文法:
(1)E->TG
(2)G->+TG|—TG
(3)G->ε
(4)T->FS
(5)S->*FS|/FS
(6)S->ε
(7)F->(E)
(8)F->i
二、程序结构:
在程序开始之前,先手动计算出文法对应的预测分析表,然后再程序中手动初始化对应的预测分析表。
使用两个栈(实际使用中用的是字符串)分别保存分析字符串和输入字符串,按照下图所示步骤进行逐步判断。
三、实验结果:
测试方法:
运行程序,输入需要分析的语句
测试结果如下:
四、实验总结:
实验之前一直在考虑如何将输入的文法构造成预测分析表,最后决定放弃这个想法利用事先构造好的预测分析表(特定文法)进行操作。
然后由于使用图形界面所以从C++语言换成了相对较方便使用图形界面的Java语言。
这次实验揭露出我在非C++语言编程和LL
(1)文法方面的不足之处。
实验三LR
(1)分析法
一实验原理
LR
(1)分析法实验设计思想及算法
(1)总控程序,也可以称为驱动程序。
对所有的LR分析器总控程序都是相同的。
(2)分析表或分析函数,不同的文法分析表将不同,同一个文法采用的LR分析器不同时,分析表将不同,分析表又可以分为动作表(ACTION)和状态转换(GOTO)表两个部分,它们都可用二维数组表示。
(3)分析栈,包括文法符号栈和相应的状态栈,它们均是先进后出栈。
分析器的动作就是由栈顶状态和当前输入符号所决定。
二、程序结构
◆LR分析器由三个部分组成:
◆其中:
SP为栈指针,S[i]为状态栈,X[i]为文法符号栈。
状态转换表用GOTO[i,X]=j表示,规定当栈顶状态为i,遇到当前文法符号为X时应转向状态j,X为终结符或非终结符。
◆ACTION[i,a]规定了栈顶状态为i时遇到输入符号a应执行。
动作有四种可能:
(1)移进:
action[i,a]=Sj:
状态j移入到状态栈,把a移入到文法符号栈,其中i,j表示状态号。
(2)归约:
action[i,a]=rk:
当在栈顶形成句柄时,则归约为相应的非终结符A,即文法中有A-B的产生式,若B的长度为R(即|B|=R),则从状态栈和文法符号栈中自顶向下去掉R个符号,即栈指针SP减去R,并把A移入文法符号栈内,j=GOTO[i,A]移进状态栈,其中i为修改指针后的栈顶状态。
(3)接受acc:
当归约到文法符号栈中只剩文法的开始符号S时,并且输入符号串已结束即当前输入符是'#',则为分析成功。
(4)报错:
当遇到状态栈顶为某一状态下出现不该遇到的文法符号时,则报错,说明输入端不是该文法能接受的符号串。
三、实验结果:
程序测试:
输入需要规约的字符串
测试结果:
四、实验总结
本次实验难度较高,我在参考了一些同学的程序代码之后终于完成了实验。
反应出我在LR文法方面的薄弱。
另外本来也想设计图形界面的就用了Java语言,最后由于时间不够就没做,只用了控制台的界面。
附录:
实验一源代码:
//常数5标识符6缺少存储标识符和常数的功能
#include
#include
#include
#include
#include
#include
usingnamespacestd;
stringk[8]={"do","end","for","if","printf","scanf","then","while"};
chars[6]={',',';','(',')','[',']'};
stringop1[6]={"+","-","*","/","++","--"};
stringop2[6]={"<","<=","=",">",">=","<>"};
vector
vector
introw=1,line=1;
intc;
boolerror=false;
boolover=false;
strings1,s2,s3,s4;
boolisOver(charch){
for(inti=0;i<6;i++)
if(ch==s[i])returntrue;
for(inti=0;i<6;i++)
if(ch==op1[i].at(0))returntrue;
for(inti=0;i<6;i++)
if(ch==op2[i].at(0))returntrue;
if(ch==''||ch=='\n')returntrue;
returnfalse;
}
boolisNum(charch){
if(ch>47&&ch<58)returntrue;
returnfalse;
}
boolisLetter(charch){
if(ch>64&&ch<91)returntrue;
if(ch>96&&ch<123)returntrue;
returnfalse;
}
boolisK(strings){
for(inti=0;i<8;i++)
if(s==k[i])returntrue;
returnfalse;
}
boolisS(charch){
for(inti=0;i<6;i++)
if(ch==s[i])returntrue;
returnfalse;
}
boolisOP1(charch){
for(inti=0;i<6;i++)
if(ch==op1[i].at(0))returntrue;
returnfalse;
}
boolisOP1(strings){
for(inti=0;i<6;i++)
if(s==op1[i])returntrue;
returnfalse;
}
boolisOP2(charch){
for(inti=0;i<6;i++)
if(ch==op2[i].at(0))returntrue;
returnfalse;
}
boolisOP2(strings){
for(inti=0;i<6;i++)
if(s==op2[i])returntrue;
returnfalse;
}
intmain(){
cout< ifstreamtest("test.txt"); charch; if(! test.eof()) test.read(&ch,1); while(! test.eof()){ stringtemp=""; if(ch=='\n'){ row=1; line++; test.read(&ch,1); continue; } if(ch==''){ test.read(&ch,1); continue; } if(isNum(ch)){ booldot=false; temp=temp+ch; while(! test.eof()){ test.read(&ch,1); if(isOver(ch)){ over=true; break; } else{ if(! (isNum(ch)||ch=='.')||(ch=='.'anddot)){ error=true; } if(ch=='.')dot=true; temp=temp+ch; continue; } } if(! error){ ci.push_back(temp); c=5; } elsec=0; } elseif(isLetter(ch)||ch=='_'){ temp=temp+ch; while(! test.eof()){ test.read(&ch,1); if(isOver(ch)){ over=true; break; } else{ if(! isNum(ch)&&! isLetter(ch)&&ch! ='_')error=true; temp=temp+ch; continue; } } if(! error){ if(isK(temp)) c=1; else{ c=6; id.push_back(temp); } } } elseif(isOP1(ch)){ temp=temp+ch; while(! test.eof()){ test.read(&ch,1); if(! isOP1(ch)){ over=true; break; } else{ temp=temp+ch; continue; } } if(! error){ if(isOP1(temp)) c=3; else{ error=true; } } } elseif(isOP2(ch)){ temp=temp+ch; test.read(&ch,1); stringtemp1=temp+ch; if(isOP2(temp1)){ temp=temp1; test.read(&ch,1); } c=4; } elseif(isS(ch)){ temp=temp+ch; test.read(&ch,1); c=2; } else{ temp=temp+ch; while(! test.eof()){ test.read(&ch,1); if(isOver(ch)){ over=true; break; } else{ temp=temp+ch; continue; } } error=true; c=0; } /*switch(c){ case1: cout< cout<<"("< cout<<"关键字"< cout<<"("< cout< break; case2: cout< cout<<"("< cout<<"分界符"< cout<<"("< cout< break; case3: cout< cout<<"("< cout<<"算术运算符"< cout<<"("< cout< break; case4: cout< cout<<"("< cout<<"关系运算符"< cout<<"("< cout< break; case5: cout< cout<<"("< cout<<"常数"< cout<<"("< cout< break; case6: cout< cout<<"("< cout<<"标识符"< cout<<"("< cout< break; default: cout< cout<<"Error"< cout<<"Error"< cout<<"("< cout< break; }*/ s1=temp; stringstreamss2; ss2<<'('< ss2>>s2; switch(c){ case1: s3="关键字";break; case2: s3="分界符";break; case3: s3="算术运算符";break; case4: s3="关系运算符";break; case5: s3="常数";break; case6: s3="标识符";break; } if(error){ s2="Error"; s3="Error"; } stringstreamss4; ss4<<'('< ss4>>s4; cout< row++; error=false; over=false; } test.close(); return0; } 实验二源代码: importjava.awt.BorderLayout; importjava.awt.event.ActionEvent; importjava.awt.event.ActionListener; importjava.awt.event.WindowAdapter; importjava.awt.event.WindowEvent; importjava.util.Vector; importjavax.swing.*; importjavax.swing.border.TitledBorder; importjavax.swing.table.DefaultTableModel; @SuppressWarnings("serial") publicclassLLextendsJFrame{ staticJTextAreata=newJTextArea(1,42); JTextFieldtf=newJTextField("",21); JButtonenter=newJButton("确认"); JTabletable=newJTable(); DefaultTableModeltableModel=(DefaultTableModel)table.getModel(); LLListenerllListener=newLLListener(); LL(Stringtitle){ super(title); init(); enter.addActionListener(llListener); addWindowListener(newWindowAdapter(){ publicvoidwindowClosing(WindowEvente){//窗口监视器,用于关闭窗口。 System.exit(0); } }); setVisible(true); } voidinit(){ setSize(480,320); setResizable(true); JPanelNorth=newJPanel(); North.add(newJLabel("请输入句子: ")); North.add(tf); North.add(enter); TitledBordertitle=BorderFactory.createTitledBorder("输入"); North.setBorder(title);//添加带标题的边框 this.add(North,BorderLayout.NORTH); tableModel.addColumn("步骤"); tableModel.addColumn("分析栈"); tableModel.addColumn("输入串"); tableModel.addColumn("产生式"); JScrollPaneCenter=newJScrollPane(table); Center.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); Center.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); this.add(Center,BorderLayout.CENTER); JPanelSouth=newJPanel(); South.add(ta); this.add(South,BorderLayout.SOUTH); } classLLListenerimplementsActionListener{ publicvoidactionPerformed(ActionEvente){ Strings=e.getActionCommand(); if(s=="确认"){ ta.setText(""); for(intindex=table.getModel().getRowCount()-1;index>=0;index--){ tableModel.removeRow(index); } Stringinput=tf.getText(); setInputString(input); setCount(1,1,0,0); setP(); setFenxi(); booleanb=judge(); String[]temp={"0","#E",input,""}; tableModel.addRow(temp); for(inti=0;i String[]temp1={v1.get(i),v2.get(i+1),v3.get(i+1),v4.get(i)}; tableModel.addRow(temp1); } if(b){ ta.append("您输入的字符串"+input+"是该文法的一个句子\n"); }else{ ta.append("您输入的字符串"+input+"有词法错误! \n"); } table.repaint(); v1.clear(); v2.clear(); v3.clear(); v4.clear(); } } } Vector Vector
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译原理实验报告 编译 原理 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)