编译原理 课程设计词法分析 2.docx
《编译原理 课程设计词法分析 2.docx》由会员分享,可在线阅读,更多相关《编译原理 课程设计词法分析 2.docx(23页珍藏版)》请在冰豆网上搜索。
编译原理课程设计词法分析2
Test.Java:
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.IOException;
publicclassTest{
privateStringgjz[]={"int","float","void","if","else","while",
"do","return","main","for"};
privateStringysf[]={"+","-","*","/","<","<=",">",">=","==",
"!
=","=","(",")","[","]","{","}",",",";","++","--"};
privateFilefile;
privateStringfindgjz[]=newString[10];
privateStringfindysf[]=newString[21];
privateStringfindbzf[]=newString[20];
privateStringfindszcl[]=newString[20];
privateStringguanjianzi="关键字:
";
privateStringbiaozhifu="标识符:
";
privateStringfuhao="运算符:
";
privateStringshuzichangliang="数字常量:
";
privateStringflag="";
publicStringCF()
{
returnflag;
}
publicTest(Filefile){
this.file=file;
}
publicStringkindofstyle(Stringstr){
Stringmsg="";
intindex=-1;
charc=str.charAt(0);
if(c<='z'&&c>='a'||c<='Z'&&c>='A'){
for(inti=0;iif(str.equals(gjz[i])){
index=i;
}
if(index!
=-1){
msg+="关键字";
}else{
msg+="标识符";
}
}elseif(c<='9'&&c>='0'){
msg+="数字常量";
}else{
msg+="运算符";
}
returnmsg;
}
publicintgjzpriority(Stringstr){
intindex=-1;
for(inti=0;iif(str.equals(gjz[i]))
index=i+5;
returnindex;
}
publicintysfpriority(Stringstr){
intindex=-1;
for(inti=0;iif(str.equals(ysf[i]))
index=i+15;
returnindex;
}
publicvoidinitfind(Stringstr[])
{
for(inti=0;i{
str[i]="";
}
}
publicvoidaddfind(Stringstr[],Stringstring)
{
intflag=0;
intj=0;
for(inti=0;!
str[i].equals("");i++)
{
if(str[i].equals(string))
{
flag=1;
break;
}
j++;
}
if(flag==0)
str[j]=string;
}
publicStringreadFromfile()throwsIOException{
FileInputStreamfin=newFileInputStream(file);
//System.out.println(file.getName()+":
");
intcount=0;
Stringstr="";
Stringstring="";
initfind(findgjz);
initfind(findysf);
initfind(findbzf);
initfind(findszcl);
while((count=fin.read())>0){
charc=(char)count;
if(c=='\n')
{
str="";
continue;
}
if(str.equals("")){
str+=c;
}else{
charx=str.charAt(str.length()-1);
if(isYunsuanfu(x)){
if(!
isYunsuanfu(c)){
if(str.length()==2)//处理“AB,CB之类的
{
string+="双目运算符:
"+str+"优先级"
+ysfpriority(str)+"\n";
addfind(findysf,str);
}
else
{
if(ysfpriority(str)==-1)
{
string+="未定义字符:
"+str+"优先级"
+ysfpriority(str)+"\n";
for(inti=0;i{
if(ysf[i].equals(str)){
addfind(findysf,str);}
}
}
else{
string+="运算符:
"+str+"优先级"
+ysfpriority(str)+"\n";
for(inti=0;i{
if(ysf[i].equals(str)){
addfind(findysf,str);}
}
}
}
if(ysfpriority(str)==-1)
{
flag+=str;
}
str="";
str+=c;
}else{
if(c=='='||c=='+'||c=='-'){
str+=c;
}else{
if(str.length()==2)//处理“+—,>=之类
{
string+="双目运算符:
"+str+"优先级"
+ysfpriority(str)+"\n";
addfind(findysf,str);
}
else
{
if(ysfpriority(str)==-1)
{
string+="未定义字符:
"+str+"优先级"
+ysfpriority(str)+"\n";
for(inti=0;i{
if(ysf[i].equals(str)){
addfind(findysf,str);}
}
}
else{
string+="运算符:
"+str+"优先级"
+ysfpriority(str)+"\n";
for(inti=0;i{
if(ysf[i].equals(str)){
addfind(findysf,str);}
}
}
}
if(ysfpriority(str)==-1)
{
flag+=str;
}
str="";
str+=c;
}
}
}
if(isLetter(x)){
if(isLetter(c)){
str+=c;
}else{
intindex=-1;
if(kindofstyle(str).equals("关键字"))
{
index=gjzpriority(str);
addfind(findgjz,str);
}
else
{
index=1;
addfind(findbzf,str);
}
string+=kindofstyle(str)+":
"+str+"优先级"
+index+"\n";
str="";
str+=c;
}
}
if(isDigital(x)){
if(isDigital(c))
str+=c;
else{
string+=kindofstyle(str)+":
"+str+"优先级"
+"1"+"\n";
addfind(findszcl,str);
str="";
str+=c;
}
}
if(x==''){
str="";
str+=c;
}
}
}
fin.close();
returnstring;
}
publicbooleanisYunsuanfu(charc){
if(!
isLetter(c)&&!
isDigital(c)&&c!
='')
returntrue;
else
returnfalse;
}
publicbooleanisLetter(charc){
if(c<='z'&&c>='a'||c<='Z'&&c>='A')
returntrue;
else
returnfalse;
}
publicbooleanisDigital(charc){
if(c<='9'&&c>='0')
returntrue;
else
returnfalse;
}
publicStringgjzresult()
{
Stringgjzr="";
for(inti=0;i{
gjzr+=findgjz[i]+"\n";
}
returngjzr;
}
publicStringfhresult()
{
Stringfhr="";
for(inti=0;i{
fhr+=findysf[i]+"\n";
}
returnfhr;
}
publicStringbzfresult()
{
Stringbzfr="";
for(inti=0;i{
bzfr+=findbzf[i]+"\n";
}
returnbzfr;
}
publicStringszclresult()
{
Stringszclfr="";
for(inti=0;i{
szclfr+=findszcl[i]+"\n";
}
returnszclfr;
}
publicStringResult()
{
for(inti=0;i{
guanjianzi+=findgjz[i]+"";
}
for(inti=0;i{
fuhao+=findysf[i]+"";
}
for(inti=0;i{
biaozhifu+=findbzf[i]+"";
}
for(inti=0;i{
shuzichangliang+=findszcl[i]+"";
}
Stringresult=guanjianzi+"\n"+"\n"+biaozhifu+"\n"+"\n"+fuhao+"\n"+"\n"+shuzichangliang+"\n";
//System.out.println(result);
returnresult;
}
}
Result.java:
importjava.awt.BorderLayout;
importjava.awt.GridLayout;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.awt.event.MouseEvent;
importjava.awt.event.MouseListener;
importjava.io.File;
importjava.io.FileReader;
importjava.io.FileWriter;
importjava.io.IOException;
importjavax.swing.JButton;
importjavax.swing.JFileChooser;
importjavax.swing.JFrame;
importjavax.swing.JLabel;
importjavax.swing.JMenu;
importjavax.swing.JMenuBar;
importjavax.swing.JMenuItem;
importjavax.swing.JOptionPane;
importjavax.swing.JPanel;
importjavax.swing.JPopupMenu;
importjavax.swing.JScrollPane;
importjavax.swing.JTextArea;
publicclassResultextendsJFrameimplementsActionListener,MouseListener{
/**
*
*/
privatestaticfinallongserialVersionUID=1L;
privateFilefile;
privateTesttest;
privateJFileChooserfchooser;
privateJTextAreasp,spresult,sxzp,gjzp,bzfp,fhp,szclp;
privateJButtoncffx,tc;
privateJPopupMenupopupmenu;
publicResult(){
super("词法分析器");
this.setBounds(300,100,800,600);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
JMenuBarmenubar=newJMenuBar();
this.setJMenuBar(menubar);
Stringmenustr[]={"文件","编辑","帮助"};
JMenumenu[]=newJMenu[menustr.length];
for(inti=0;i
menu[i]=newJMenu(menustr[i]);
menubar.add(menu[i]);
}
Stringmenuitemstr1[]={"清屏","打开","保存","另存为","导出分析结果"};
JMenuItemmenuitem[]=newJMenuItem[menuitemstr1.length];
for(inti=0;imenuitem[i]=newJMenuItem(menuitemstr1[i]);
menu[0].add(menuitem[i]);
menuitem[i].addActionListener(this);
}
Stringmenuitemstr2[]={"剪切","复制","粘贴"};
JMenuItemmenuitem2[]=newJMenuItem[menuitemstr2.length];
for(inti=0;imenuitem2[i]=newJMenuItem(menuitemstr2[i]);
menu[1].add(menuitem2[i]);
menuitem2[i].addActionListener(this);
}
this.getContentPane().setLayout(newGridLayout(2,1));
JPanelpanel0=newJPanel(newGridLayout(1,2));
sp=newJTextArea();
spresult=newJTextArea();
spresult.setEditable(false);
panel0.add(newJScrollPane(sp));
panel0.add(newJScrollPane(spresult));
sp.addMouseListener(this);
spresult.addMouseListener(this);
this.getContentPane().add(panel0);
JPanelpanel=newJPanel(newBorderLayout());
this.getContentPane().add(panel);
JPanelpanel1=newJPanel(newGridLayout(1,5));
Stringlabelname[]={"属性字:
","关键字:
","标识符:
","运算符:
","数字常量:
"};
JLabellabel[]=newJLabel[labelname.length];
for(inti=0;ilabel[i]=newJLabel(labelname[i]);
panel1.add(label[i]);
}
panel.add(panel1,"North");
JPanelpanel2=newJPanel(newGridLayout(1,5));
sxzp=newJTextArea();
sxzp.setEditable(false);
panel2.add(newJScrollPane(sxzp));
gjzp=newJTextArea();
gjzp.setEditable(false);
panel2.add(newJScrollPane(gjzp));
bzfp=newJTextArea();
bzfp.setEditable(false);
panel2.add(newJScrollPane(bzfp));
fhp=newJTextArea();
fhp.setEditable(false);
panel2.add(newJScrollPane(fhp));
szclp=newJTextArea();
szclp.setEditable(false);
panel2.add(newJScrollPane(szclp));
panel.add(