编译原理词法分析器实现.docx
- 文档编号:5933994
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:13
- 大小:97.50KB
编译原理词法分析器实现.docx
《编译原理词法分析器实现.docx》由会员分享,可在线阅读,更多相关《编译原理词法分析器实现.docx(13页珍藏版)》请在冰豆网上搜索。
编译原理词法分析器实现
实验1《词法分析程序设计与实现》
一、实验目的
加深对词法分析器的工作过程的理解;加强对词法分析方法的掌握;能够采用一种编程语言实现简单的词法分析程序;能够使用自己编写的分析程序对简单的程序段进行词法分析。
二、实验内容
自定义一种程序设计语言,或者选择已有的一种高级语言,编制它的词法分析程序。
词法分析程序的实现可以采用任何一种编程语言和编程工具。
从输入的源程序中,识别出各个具有独立意义的单词,即关键字、标识符、常数、运算符、界符。
并依次输出各个单词的内部编码及单词符号自身值。
(遇到错误时可显示“Error”,然后跳过错误部分继续显示)
三、实验方法
通过自定义一组符号表,存储到属性文件中,然后使用一些if和else语句来判断所获取的字符的类型,并输出相应的码。
四、实验步骤
1.定义目标语言的可用符号表和构词规则;
2.依次读入源程序符号,对源程序进行单词切分和识别,直到源程序结束;
3.对正确的单词,按照它的种别以<种别码,值>的形式保存在符号表中;
4.对不正确的单词,做出错误处理。
五、实验结果
项目截图:
六、实验结论
源代码如下:
这是Lexer类:
package词法分析程序;
importjava.awt.BorderLayout;
importjava.awt.Dimension;
importjava.awt.Font;
importjava.awt.Graphics;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.awt.image.BufferedImage;
importjava.io.File;
importjava.io.FileNotFoundException;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.util.Properties;
importjavax.swing.BorderFactory;
importjavax.swing.ImageIcon;
importjavax.swing.JButton;
importjavax.swing.JFrame;
importjavax.swing.JPanel;
importjavax.swing.JScrollPane;
importjavax.swing.JTextArea;
publicclassLexer{
privatestaticStringTITLE="欢迎使用本系统!
";
booleanflag=false;
intx=-250,y=50;
privateintcode=0;
privatechar[]ch;
privateStringstrToken="";
privateStringBuffersb=newStringBuffer(strToken);
privateJTextAreainputArea,statusArea;
/**
*构造器创建swing操作界面
*/
publicLexer(){
//创建符号表,初次运行时请执行下面的函数
//createProperty();
JFrameframe=newJFrame("词法分析器");
frame.setDefaultCloseOperation(3);
frame.setSize(500,550);
frame.setLocationRelativeTo(null);
finalJPanelnorth=newJPanel();
north.setPreferredSize(newDimension(0,100));
inputArea=newJTextArea();
inputArea.setFont(newFont("",Font.BOLD,18));
inputArea.setBorder(BorderFactory.createTitledBorder("代码框"));
JScrollPanejs1=newJScrollPane(inputArea);
statusArea=newJTextArea();
statusArea.setEditable(false);
statusArea.setBorder(BorderFactory.createTitledBorder("状态框"));
statusArea.setFont(newFont("",Font.PLAIN,15));
JScrollPanejs2=newJScrollPane(statusArea);
js2.setPreferredSize(newDimension(150,500));
JPaneljPanel=newJPanel();
JButtonstart=newJButton("开始分析");
JButtonclear=newJButton("清空");
jPanel.add(start);
jPanel.add(clear);
frame.add(north,BorderLayout.NORTH);
frame.add(js1,BorderLayout.CENTER);
frame.add(js2,BorderLayout.EAST);
frame.add(jPanel,BorderLayout.SOUTH);
frame.setVisible(true);
finalGraphicsg=north.getGraphics();
newThread(){
publicvoidrun(){
BufferedImagebf=newBufferedImage(north.getWidth(),north
.getHeight(),BufferedImage.TYPE_INT_RGB);
Graphicsgg=bf.getGraphics();
gg.setFont(newFont("华文行楷",Font.ITALIC,25));
while(true){
try{
Thread.sleep(10);
}catch(InterruptedExceptionex){
ex.printStackTrace();
}
if(flag){
continue;
}
gg.drawImage(newImageIcon("images/sky.jpg").getImage(),0,
0,null);
gg.drawString(TITLE,x,y);
x++;
if(x>north.getWidth())
x=-250;
g.drawImage(bf,0,0,null);
}
}
}.start();
start.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
if(inputArea.getText().isEmpty()){
statusArea.setText("请在左边输入代码!
");
}else{
statusArea.setText("");
initLexer(inputArea.getText());
}
}
});
clear.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
inputArea.setText("");
statusArea.setText("");
}
});
}
/**
*
*@paramsrc
*/
publicvoidinitLexer(Stringsrc){
//去掉大多无用的换行,减少循环次数
src=src.replace('\n','\0');
src=src.replace('\t','\0');
ch=src.toCharArray();
intlen=ch.length;
for(inti=0;i while(ch[i]==''){ i++; } if(isLetter(ch[i])){ while(i sb.append(ch[i]); i++; } i--; code=reserve(sb); if(code==0){ statusArea.append("<1,"+insertId(sb)+">\n"); }else{ statusArea.append("<"+code+","+insertId(sb)+">\n"); } clear(); }elseif(isDigit(ch[i])){ while(isDigit(ch[i])){ sb.append(ch[i]); i++; } i--; statusArea.append("<2,"+insertConst(sb)+">\n"); clear(); }elseif(ch[i]=='+') statusArea.append("<3,+>\n"); elseif(ch[i]=='-') statusArea.append("<4,->\n"); elseif(ch[i]=='*') statusArea.append("<5,*>\n"); elseif(ch[i]=='/') statusArea.append("<6,/>\n"); elseif(ch[i]=='=') statusArea.append("<7,=>\n"); elseif(ch[i]==',') statusArea.append("<8,,>\n"); elseif(ch[i]=='(') statusArea.append("<9,(>\n"); elseif(ch[i]==')') statusArea.append("<10,)>\n"); elseif(ch[i]=='{') statusArea.append("<11,{>\n"); elseif(ch[i]=='}') statusArea.append("<12,}>\n"); elseif(ch[i]=='[') statusArea.append("<13,[>\n"); elseif(ch[i]==']') statusArea.append("<14,]>\n"); elseif(ch[i]==';') statusArea.append("<15,;>\n"); elseif(ch[i]=='.') statusArea.append("<16,.>\n"); else procError(i); } } privatevoidclear(){ this.sb=newStringBuffer(""); } privatevoidprocError(inti){ statusArea.append(ch[i]+"不在符号表中! \n"); } privateStringinsertConst(StringBuffersb){ Stringcontent=newString(sb); returncontent; } privateStringinsertId(StringBuffersb){ Stringcontent=newString(sb); returncontent; } privateintreserve(StringBuffersb){ Stringcontent=newString(sb); PropertieschartPro=newProperties(); Filefile=newFile("Chart.properties"); LexerUtil.loadPro(chartPro,file); if(chartPro.containsKey(content)){ returnInteger.parseInt(chartPro.getProperty(content)); } return0; } privatebooleanisDigit(charch){ if(String.valueOf(ch).isEmpty()){ returnfalse; }elseif(ch>='0'&&ch<='9'){ returntrue; } returnfalse; } privatebooleanisLetter(charch){ if(String.valueOf(ch).isEmpty()){ returnfalse; }elseif(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z'){ returntrue; } returnfalse; } publicstaticvoidinsert(PropertiesuserPro,Filefile,Stringc_char, Stringc_type){ userPro.setProperty(c_char,c_type); try{ userPro.store(newFileOutputStream(file), "Copyright(c)LexerbyCT"); }catch(FileNotFoundExceptione1){ e1.printStackTrace(); }catch(IOExceptione1){ e1.printStackTrace(); } } @SuppressWarnings("unused") privatestaticvoidcreateProperty(){ PropertieschartPro=newProperties(); Filefile=newFile("Chart.properties"); LexerUtil.loadPro(chartPro,file); insert(chartPro,file,"标识符","1"); insert(chartPro,file,"常数(整)","2"); insert(chartPro,file,"+","3"); insert(chartPro,file,"-","4"); insert(chartPro,file,"*","5"); insert(chartPro,file,"/","6"); insert(chartPro,file,"=","7"); insert(chartPro,file,",","8"); insert(chartPro,file,"(","9"); insert(chartPro,file,")","10"); insert(chartPro,file,"{","11"); insert(chartPro,file,"}","12"); insert(chartPro,file,"[","13"); insert(chartPro,file,"]","14"); insert(chartPro,file,";","15"); insert(chartPro,file,".","16"); insert(chartPro,file,"if","17"); insert(chartPro,file,"while","18"); insert(chartPro,file,"for","19"); insert(chartPro,file,"void","20"); insert(chartPro,file,"try","21"); insert(chartPro,file,"public","22"); insert(chartPro,file,"true","23"); insert(chartPro,file,"false","24"); insert(chartPro,file,"break","25"); insert(chartPro,file,"static","26"); insert(chartPro,file,"throw","27"); insert(chartPro,file,"private","28"); insert(chartPro,file,"new","29"); insert(chartPro,file,"return","30"); insert(chartPro,file,"default","31"); insert(chartPro,file,"catch","32"); insert(chartPro,file,"finally","33"); insert(chartPro,file,"protected","34"); insert(chartPro,file,"else","35"); insert(chartPro,file,"case","36"); insert(chartPro,file,"switch","37"); insert(chartPro,file,"int","38"); insert(chartPro,file,"long","39"); insert(chartPro,file,"double","40"); insert(chartPro,file,"float","41"); insert(chartPro,file,"String","42"); insert(chartPro,file,"boolean","43"); } /** *测试程序 * *@paramargs */ publicstaticvoidmain(String[]args){ newLexer(); } } 这是LexerUtil类: package词法分析程序; importjava.io.File; importjava.io.FileInputStream; importjava.io.FileNotFoundException; importjava.io.IOException; importjava.text.SimpleDateFormat; importjava.util.Date; importjava.util.Properties; publicclassLexerUtil{ //Properties加载文件信息 publicstaticvoidloadPro(Propertiespro,Filefile){ if(! file.exists()){ try{ file.createNewFile(); }catch(IOExceptione){ e.printStackTrace(); } } try{ pro.load(newFileInputStream(file)); }catch(FileNotFoundExceptione){ e.printStackTrace(); }catch(IOExceptione){ e.printStackTrace(); } } publicstaticStringgetTimer(){ SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-ddHH: mm: ss"); returnsdf.format(newDate()); } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 词法 分析器 实现