原版第2组编译原理实验报告.docx
- 文档编号:6812429
- 上传时间:2023-01-10
- 格式:DOCX
- 页数:37
- 大小:298.15KB
原版第2组编译原理实验报告.docx
《原版第2组编译原理实验报告.docx》由会员分享,可在线阅读,更多相关《原版第2组编译原理实验报告.docx(37页珍藏版)》请在冰豆网上搜索。
原版第2组编译原理实验报告
院系:
计算机科学学院
专业:
计算机科学与技术
年级:
09级
课程名称:
编译原理
组号:
2
学号姓名:
09061010张鹏
学号姓名:
09061015陈鹏
学号姓名:
09061017马菘璠
指导教师:
李航高
2011年12月12日
年级
2009
班号
计科一大班
(1)小班
专业
计算机科学与技术
学号
09061010
学号
09061015
学号
09061017
姓名
张鹏
姓名
陈鹏
姓名
马菘璠
实验名称
实验一:
词法分析
实验
类型
设计型
综合型
创新型
√
实
验
目
的
或
要
求
通过编写一个具体的词法分析程序,加深对词法分析原理的理解。
掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。
编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。
依次输出各个单词的内部编码及单词符号自身值。
要求用可视化编程工具编写;要求有界面(即一般windows下应用程序界面)。
输入为c语言源代码。
要求输出如下(也可以以文件形式输出)。
(2,”main”)
(5,”(“)
(5,”)“)
(5,”{“}
(1,”int”)
(2,”a1”)
(5,”,”)
(2,”b2”)
(5,”;”)
(2,”a1”)
(4,”=”)
(3,”10”)
(5,”;”)
(2,”b2”)
(4,”=”)
(2,”a1”)
(4,”+”)
(3,”20.35”)
(5,”;”)
……
(5,”}“)注:
为右大括号
要求(可根据实际情况加以扩充和修改):
识别保留字:
if、int、for、while、do、return、break、continue等等;单词种别码为1。
其他的都识别为标识符;单词种别码为2。
常数为无符号数;单词种别码为3。
运算符包括:
+、-、*、/、=、>、<等;可以考虑更复杂情况>=、<=、!
=;单词种别码为4。
分隔符包括:
“,”“;”“(”“)”“{”“}”等;单词种别码为5。
实
验
记
录
1、算法流程图
开始
读取文件
判断
判断保留字
和标识符
判断运算符、关系运算符、分界符
判断数值,
整型和浮
点型
2、程序代码
publicclassFristNoteBookextendsJFrame{
privateJTextAreafiletextArea;
privateJTextAreafiletextArea_2;
privateJButtonbtn;
privateJButtonbtn_2;
Stringname=null;
publicstaticvoidmain(Stringargs[]){
EventQueue.invokeLater(newRunnable(){
publicvoidrun(){
try{
UIManager.setLookAndFeel(UIManager
.getSystemLookAndFeelClassName());
FristNoteBookframe=newFristNoteBook();
frame.setVisible(true);
}catch(Exceptione){
e.printStackTrace();
}
publicFristNoteBook(){
super();
setTitle("词法分析工具");
this.setResizable(false);
getContentPane().setLayout(null);
setBounds(100,100,600,450);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JMenuBarjmBar=newJMenuBar();
this.setJMenuBar(jmBar);
JMenufileMenu=newJMenu("文件");
JMenuediteMenu=newJMenu("编辑");
JMenuhelpMenu=newJMenu("帮助");
jmBar.add(fileMenu);
jmBar.add(editeMenu);
/*
jmBar.add(helpMenu);
*/
JMenuItemnewFile=newJMenuItem("新建");
newFile.addActionListener(newActionListener(){
publicvoidactionPerformed(finalActionEvente){
filetextArea.setText("");//实现将文本域中的内容清空
}
});
JMenuItemopenFile=newJMenuItem("打开");//定义"打开菜单项"
openFile.addActionListener(newActionListener(){//绑定单击事件
publicvoidactionPerformed(finalActionEvente){
openFile(e);//调用openFile()方法
BufferedReaderbr;//创建BufferedReader对象
try{
if(name!
=null){//如果String对象不为空
br=newBufferedReader(newFileReader(name));
//实例化BufferedReader对象
StringBuffersb=newStringBuffer();//定义字符创生成器对象
Stringaline;
while((aline=br.readLine())!
=null){//循环读取流中数据
sb.append(aline+'\n');//向字符串生成器中追加内容
}
br.close();//将流关闭
filetextArea.setText(sb.toString());//将读取内容,设置为文本域内容
}
}catch(Exceptione1){
e1.printStackTrace();
}
}
});
JMenuItemsaveFile=newJMenuItem("保存");
saveFile.addActionListener(newActionListener(){
publicvoidactionPerformed(finalActionEvente){
MyFileChoosermyFileChooser=newMyFileChooser();
//创建包含有保存文件对话框的MyFileChooser类对象
myFileChooser.getFileChooser();
//调用该类的获取保存文件对话框方法
BufferedWriterbw;//创建BufferedWriter对象
try{
bw=newBufferedWriter(newFileWriter(myFileChooser
.getPath()));
//根据用户选择地址,实例化BufferedWriter对象
bw.write(filetextArea.getText());//将文本域中内容写入流中
bw.close();//将流关闭
}catch(Exceptione1){
e1.printStackTrace();
}
}
});
JMenuItemexit=newJMenuItem("退出");
exit.addActionListener(newActionListener(){
publicvoidactionPerformed(finalActionEvente){
System.exit(0);
}
});
fileMenu.add(newFile);
fileMenu.add(openFile);
fileMenu.add(saveFile);
fileMenu.add(exit);
JMenuItemcopeEdite=newJMenuItem("复制");
copeEdite.addActionListener(newActionListener(){
publicvoidactionPerformed(finalActionEvente){
ClipUtilclipUtil=newClipUtil();//创建ClipUtil对象
clipUtil.setData(filetextArea.getText());//调用复制数据方法
}
});
JMenuItemcutEdite=newJMenuItem("剪切");
cutEdite.addActionListener(newActionListener(){
publicvoidactionPerformed(finalActionEvente){
ClipUtilclipUtil=newClipUtil();
clipUtil.setData(filetextArea.getSelectedText());//调用复制数据方法
filetextArea.replaceRange("",filetextArea.getSelectionStart(),
filetextArea.getSelectionEnd());//将选中数据用空字符串替换
}
});
JMenuItemstickEdite=newJMenuItem("粘贴");
stickEdite.addActionListener(newActionListener(){
publicvoidactionPerformed(finalActionEvente){
ClipUtilclipUtil=newClipUtil();
Stringstr=clipUtil.getData();//调用粘贴数据方法
filetextArea.replaceRange(str,
filetextArea.getSelectionStart(),filetextArea
.getSelectionEnd());//设置文本域中数据
}
});
JMenuItemallEdite=newJMenuItem("全选");
allEdite.addActionListener(newActionListener(){
publicvoidactionPerformed(finalActionEvente){
filetextArea.setSelectionStart(0);//设置文本域中选定文本的开始位置
filetextArea.setSelectionEnd(filetextArea.getText().length());
//设置文本域中选定文本的结束位置
}
});
editeMenu.add(copeEdite);
editeMenu.add(cutEdite);
editeMenu.add(stickEdite);
editeMenu.add(allEdite);
JMenuItemheplEdite=newJMenuItem("关于词法分析器");
heplEdite.addActionListener(newActionListener(){
publicvoidactionPerformed(finalActionEvente){
MyAboutmyAbout=newMyAbout();
myAbout.setVisible(true);
}
});
/*helpMenu.add(heplEdite);*/
finalJScrollPanescrollPane=newJScrollPane();
scrollPane.setBounds(0,0,350,400);
getContentPane().add(scrollPane);
filetextArea=newJTextArea();
scrollPane.setViewportView(filetextArea);
finalJScrollPanescrollPane_2=newJScrollPane();
scrollPane_2.setBounds(430,0,165,400);
getContentPane().add(scrollPane_2);
filetextArea_2=newJTextArea();
scrollPane_2.setViewportView(filetextArea_2);
/*
*用于词法分析的按钮触发
*/
btn=newJButton("分析");
btn.setBounds(355,130,70,40);
btn.addActionListener(newActionListener(){
publicvoidactionPerformed(finalActionEvente){
try{Stringstr=filetextArea.getText();
StringReadersr=newStringReader(str);
BufferedReaderbr=newBufferedReader(sr);
Stringline=newString();
inti=0;
chartoken;
StringstrWord="";
Wordlook=newWord();
filetextArea_2.setText("");
while((line=br.readLine())!
=null){
i=0;
strWord="";
while(i token=line.charAt(i); /*处理字符串判断保留字(key)和标识符*/ if((token>='a'&&token<='z')||(token>='A'&&token<='Z')){ strWord=strWord+token; while((token>='a'&&token<='z')||(token>='A'&&token<='Z')|| (token>='0'&&token<='9')){ i++; if(i token=line.charAt(i); if((token>='a'&&token<='z')||(token>='A'&&token<='Z')||( token>='0'&&token<='9')){ strWord=strWord+token; }else{ if(look.lookKey(strWord)){ filetextArea_2.append(strWord+"保留字\n"); strWord=""; }else{ filetextArea_2.append(strWord+"标示符\n"); strWord=""; }break;} }else{ if(look.lookKey(strWord)){ filetextArea_2.append(strWord+"保留字\n"); strWord=""; }else{ filetextArea_2.append(strWord+"标示符\n"); strWord=""; } break; } } /* *判断数值,整型和浮点型 */ }elseif(token>='0'&&token<='9'){ strWord=strWord+token;while((token>='a'&&token<='z')||(token>='A'&&token<='Z')||( token>='0'&&token<='9')||token=='.'){ i++; if(i token=line.charAt(i); if((token>='a'&&token<='z')||(token>='A'&&token<='Z')||( token>='0'&&token<='9')||token=='.'){ strWord=strWord+token; }else{ if(look.lookFloatNum(strWord)){ filetextArea_2.append(strWord+"浮点型\n"); strWord=""; break; }else{ filetextArea_2.append(strWord+"整型\n"); strWord=""; break; } } }else{ if(look.lookFloatNum(strWord)){ filetextArea_2.append(strWord+"浮点型\n"); strWord=""; break; }else{ filetextArea_2.append(strWord+"整型\n"); strWord=""; break; } } } /* *判断运算符、关系运算符、分界符 */ }elseif(look.lookAWord(token)){ strWord=strWord+token; while(look.lookAWord(token)){ i++; (strWord+token)||look.lookBianjie(strWord+token)){ if(i token=line.charAt(i); if(look.lookAWord(token)){if(look.lookOperator(strWord+token)||look.lookRelationOpr (strWord+token)||look.lookBianjie(strWord+token)){ if(look.lookOperator(strWord)){ strWord=strWord+token; filetextArea_2.append(strWord+"运算符\n"); strWord=""; i++; break; }elseif(look.lookRelationOpr(strWord)){ strWord=strWord+token; filetextArea_2.append(strWord+"关系运算符\n"); strWord=""; i++; break; }elseif(look.lookBianjie(strWord)){ strWord=strWord+token; filetextArea_2.append(strWord+"分界符\n"); strWord=""; i++; break; } }else{ if(look.lookOperator(strWord)){ filetextArea_2.append(strWord+"运算符\n"); strWord=""; break; }elseif(look.lookRelationOpr(strWord)){ filetextArea_2.append(strWord+"关系运算符\n"); strWord=""; break; }elseif(look.lookBianjie(strWord)){ filetextArea_2.append(strWord+"分界符\n"); strWord=""; break; } } }else{ if(look.lookOperator(strWord)){ filetextArea_2.append(strWord+"运算符\n"); strWord=""; break; }elseif(look.lookRelationOpr(strWord)){ filetextArea_2.append(strWord+"关系运算符\n"); strWord="";
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 原版 编译 原理 实验 报告