编译原理实验报告实验三最新版.docx
《编译原理实验报告实验三最新版.docx》由会员分享,可在线阅读,更多相关《编译原理实验报告实验三最新版.docx(25页珍藏版)》请在冰豆网上搜索。
编译原理实验报告实验三最新版
中南大学
编译原理课程实验
实验报告
题目实验三
学生姓名陈亮名
学生学号
专业班级1005
完成日期2012/6/2
实验三算符优先分析法设计与实现
一、实验目的
加深对语法分析器工作过程的理解;加强对算符优先分析法实现语法分析程序的掌握;能够采用一种编程语言实现简单的语法分析程序;能够使用自己编写的分析程序对简单的程序段进行语法翻译。
二、实验内容
在实验1的基础上,用算符优先分析法编制语法分析程序,语法分析程序的实现可以采用任何一种编程语言和工具。
三、实验要求:
1.对语法规则有明确的定义;
2.编写的分析程序能够对实验一的结果进行正确的语法分析;
3.对于遇到的语法错误,能够做出简单的错误处理,给出简单的错误提示,保证顺利完成语法分析过程;
四、实验步骤
1.定义目标语言的语法规则;
A.关键字后不能跟字符串运算符
B.数字后不能跟关键字,数字,字符串,标示符
C.字符串后不能跟关键字,数字,字符串,标示符
D.标示符后不能跟数字,字符串
2.依次读入实验一的分析结果,根据预测分析的方法进行语法分析,直到源程序结束;
读入程序如下:
packagecom.demo;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileNotFoundException;
importjava.io.FileOutputStream;
importjava.io.IOException;
publicclasscopy{
publicbooleancop(Stringsrc,Stringdes){
FilesorFile,desFile;
sorFile=newFile(src);
desFile=newFile(des);
FileInputStreamfis=null;
FileOutputStreamfos=null;
intn=0;
byte[]b=newbyte[4*1024];
try{
fis=newFileInputStream(src);
fos=newFileOutputStream(des);
while((n=fis.read(b))!
=-1){
fos.write(b,0,n);
//tyfkfuuofiiu
/*
*fhshtjsjtrjrs
*/
}
fos.flush();
fis.close();
fos.close();
}catch(FileNotFoundExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
returntrue;
}
publicstaticvoidmain(String[]args){
copycp=newcopy();
Stringsrc=args[0];
Stringdes=args[1];
if(cp.cop(src,des)){
public"文件复制成功"=Stringstring;//(这一句有错误)
System.out.println("文件复制成功");
}
else{
System.out.println
("shibai");
}
}
}
词法分析:
进行语法分析:
3.对遇到的语法错误做出错误处理。
注:
由于java整套语言出错的情况太多,以上只考虑了部分出错情况
分析器代码如下:
z
packagedemo;
importjava.awt.Dimension;
importjava.awt.Toolkit;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.awt.event.WindowAdapter;
importjava.awt.event.WindowEvent;
importjava.awt.event.WindowListener;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileNotFoundException;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.UnsupportedEncodingException;
importjavax.swing.JButton;
importjavax.swing.JFileChooser;
importjavax.swing.JFrame;
importjavax.swing.JOptionPane;
importjavax.swing.JScrollPane;
importjavax.swing.JTextArea;
importjavax.swing.JTextField;
publicclassWordAnalysesextendsJFrame{
privateJButtonchoosefileButton;
privateJButtonanalyseButton;
privateJButtongrammarButton;
privateJButtonexportButton;
privateJTextFieldjtf;
privateJTextAreaoutpuTextArea;
JScrollPanejsp;//新建一个滚动条界面,将文本框传入
Strings="";
Strings2="";
Stringword[][]=newString[8*1024][3];
privateintindex=0;
Filefile;
intm=0;
intf=0;
FileInputStreamfileInputStream;
//关键字
privateString[]code1=newString[]{"if","int","for","while","do",
"return","break","continue","package","public","class",
"static","void","main","new","null","abstract","boolean",
"byte","case","catch","char","default","double","else",
"enum","extends","final","finally","float","implements",
"import","instanceof","interface","long","native","private",
"protected","strictfp","short","super","switch",
"synchronized","this","throw","throws","transient","try",
"volatile"};
//运算符
privateString[]code4=newString[]{"+","-","*","/","=","<",">",
"&&","&","||","or","and","xor","!
"};
//标点
privateString[]code5=newString[]{",",";","{","}","(",
")","[","]","."};
privateStringBuffersBuffer;
publicWordAnalyses(Stringtitle){
super(title);
Toolkittoolkit=Toolkit.getDefaultToolkit();
Dimensionscrnsize=toolkit.getScreenSize();
setSize(600,700);
setLocation((scrnsize.width-600)/2,(scrnsize.height-700)/2);
myframe();
add(choosefileButton).setBounds(25,10,100,25);
add(analyseButton).setBounds(175,10,100,25);
add(grammarButton).setBounds(325,10,100,25);
add(exportButton).setBounds(475,10,100,25);
add(jsp).setBounds(0,45,590,600);
add(jtf).setBounds(0,35,600,10);
//add(jsp).setBounds(0,45,600,665);
setVisible(true);
addWindowListener(newWindowAdapter(){
publicvoidwindowClosing(WindowEvente){
System.exit(0);
}
});
}
publicvoidmyframe(){
choosefileButton=newJButton("选择文件");
choosefileButton.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
f=1;
intn;
sBuffer=newStringBuffer(s2);
try{
JFileChooserjfc=newJFileChooser();
jfc.showOpenDialog(WordAnalyses.this);
file=jfc.getSelectedFile();
fileInputStream=newFileInputStream(file);
while((n=fileInputStream.read())!
=-1){
sBuffer.append(""+(char)n);
}
}catch(FileNotFoundExceptione1){
e1.printStackTrace();
}catch(IOExceptione1){
e1.printStackTrace();
}
try{
s2=newString(sBuffer.toString().getBytes("ISO8859-1"));
}catch(UnsupportedEncodingExceptione1){
//TODOAuto-generatedcatchblock
e1.printStackTrace();
}
sBuffer=newStringBuffer(s2);
}
});
analyseButton=newJButton("开始分析");
analyseButton.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
if(f==0){
JOptionPane.showMessageDialog(rootPane,"请先选择要分析的文件!
");
}else{System.out.println(sBuffer.length());
m=0;
for(inti=0;is=s+sBuffer.charAt(i);
if(s.equals("")||s.equals("")||s.equals("\r\n")
||s.equals("\n")||s.equals("\r")){
s="";
continue;
}
//注释
if(s.equals("/")
&&(""+sBuffer.charAt(i+1)).equals("/")){
i=i+2;
s="//";
while(!
(""+sBuffer.charAt(i)).equals("\r")){
s=s+sBuffer.charAt(i);
i++;
}
System.out.println("("+"2,"+s+")");
outpuTextArea.setText(outpuTextArea.getText()+"("
+"2,"+s+")"+"\r\n");
word[index][1]=s;
word[index][2]="2";
index++;
s="";
continue;
}
//段注释
if(s.equals("/")
&&(""+sBuffer.charAt(i+1)).equals("*")){
i=i+2;
s="/*";
while(!
((""+sBuffer.charAt(i)).equals("*")&&(""+sBuffer
.charAt(i+1)).equals("/"))){
s=s+sBuffer.charAt(i);
i++;
}
i=i+2;
s=s+"*/";
System.out.println("("+"3,"+s+")");
outpuTextArea.setText(outpuTextArea.getText()+"("
+"3,"+s+")"+"\r\n");
word[index][1]=s;
word[index][2]="3";
index++;
s="";
continue;
}
//关键字
if(!
s.equals("")){
for(intj=0;jif(s.equals(code1[j])
&&((""+sBuffer.charAt(i+1)).equals("")
||(""+sBuffer.charAt(i+1))
.equals("\r")||(""+sBuffer
.charAt(i+1)).equals("\n"))){
System.out.println("("+"1,"+code1[j]+")");
outpuTextArea.setText(outpuTextArea.getText()+"("
+"1,"+code1[j]+")"+"\r\n");
word[index][1]=s;
word[index][2]="1";
index++;
s="";
break;
}
}}
//运算符
if(!
s.equals("")){
Stringsss="";
for(intj=0;jif(s.equals(code4[j])){
if(s.equals("or")||s.equals("and")
||s.equals("xor")){
System.out.println("("+"4,"+s+")");
outpuTextArea.setText(outpuTextArea
.getText()
+"("
+"7,"
+s
+")"
+"\r\n");
word[index][1]=s;
word[index][2]="7";
index++;
s="";
break;
}
sss=sss+code4[j];
for(intk=0;kif((""+sBuffer.charAt(i+1))
.equals(code4[k])){
i++;
sss=sss+code4[k];
break;
}
}
System.out.println("("+"4,"+sss+")");
outpuTextArea.setText(outpuTextArea.getText()
+"("+"7,"+sss+")"+"\r\n");
word[index][1]=s;
word[index][2]="7";
index++;
s="";
sss="";
}
}
}
//数字
if(!
s.equals("")){
if((""+sBuffer).charAt(i)>=48
&&(""+sBuffer).charAt(i)<57){
if((""+sBuffer).charAt(i+1)<48
||(""+sBuffer).charAt(i+1)>57){
System.out.println("("+"3"+","+s+")");
outpuTextArea.setText(outpuTextArea.getText()
+"("+"4"+","+s+")"+"\r\n");
word[index][1]=s;
word[index][2]="4";
index++;
s="";
}
continue;
}
}
//分隔符
if(!
s.equals("")){
for(intj=0;jif(s.equals(code5[j])){
System.out.println("("+"5"+","+code5[j]
+")");
outpuTextArea.setText(outpuTextArea.getText()
+"("+"8"+","+code5[j]+")"
+"\r\n");
word[index][1]=s;
word[index][2]="8";
index++;
s="";
break;
}
}
}
//字符串
if(s.equals("\"")){
i++;
while(!
(""+sBuffer.charAt(i)).equals("\"")){
s=s+sBuffer.charAt(i);
i++;
}
s=s+sBuffer.charAt(i);
System.out.println("("+"字符串"+","+s+")");
outpuTextArea.setText(outpuTextArea.getText()