原版第2组编译原理实验报告Word下载.docx
《原版第2组编译原理实验报告Word下载.docx》由会员分享,可在线阅读,更多相关《原版第2组编译原理实验报告Word下载.docx(37页珍藏版)》请在冰豆网上搜索。
综合型
创新型
√
实
验
目
的
或
要
求
通过编写一个具体的词法分析程序,加深对词法分析原理的理解。
掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。
编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。
依次输出各个单词的内部编码及单词符号自身值。
要求用可视化编程工具编写;
要求有界面(即一般windows下应用程序界面)。
输入为c语言源代码。
要求输出如下(也可以以文件形式输出)。
(2,”main”)
(5,”(“)
(5,”)“)
(5,”{“}
(1,”int”)
(2,”a1”)
(5,”,”)
(2,”b2”)
(5,”;
”)
(4,”=”)
(3,”10”)
(4,”+”)
(3,”20.35”)
……
(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(){
MyFileChoosermyFileChooser=newMyFileChooser();
//创建包含有保存文件对话框的MyFileChooser类对象
myFileChooser.getFileChooser();
//调用该类的获取保存文件对话框方法
BufferedWriterbw;
//创建BufferedWriter对象
bw=newBufferedWriter(newFileWriter(myFileChooser
.getPath()));
//根据用户选择地址,实例化BufferedWriter对象
bw.write(filetextArea.getText());
//将文本域中内容写入流中
bw.close();
//将流关闭
JMenuItemexit=newJMenuItem("
退出"
exit.addActionListener(newActionListener(){
System.exit(0);
fileMenu.add(newFile);
fileMenu.add(openFile);
fileMenu.add(saveFile);
fileMenu.add(exit);
JMenuItemcopeEdite=newJMenuItem("
复制"
copeEdite.addActionListener(newActionListener(){
ClipUtilclipUtil=newClipUtil();
//创建ClipUtil对象
clipUtil.setData(filetextArea.getText());
//调用复制数据方法
JMenuItemcutEdite=newJMenuItem("
剪切"
cutEdite.addActionListener(newActionListener(){
clipUtil.setData(filetextArea.getSelectedText());
filetextArea.replaceRange("
filetextArea.getSelectionStart(),
filetextArea.getSelectionEnd());
//将选中数据用空字符串替换
JMenuItemstickEdite=newJMenuItem("
粘贴"
stickEdite.addActionListener(newActionListener(){
Stringstr=clipUtil.getData();
//调用粘贴数据方法
filetextArea.replaceRange(str,
filetextArea.getSelectionStart(),filetextArea
.getSelectionEnd());
//设置文本域中数据
JMenuItemallEdite=newJMenuItem("
全选"
allEdite.addActionListener(newActionListener(){
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(){
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(){
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<
line.length()){
token=line.charAt(i);
/*处理字符串判断保留字(key)和标识符*/
if((token>
='
a'
&
token<
z'
)||(token>
A'
Z'
)){
strWord=strWord+token;
while((token>
)||
(token>
0'
9'
i++;
if(i<
token=line.charAt(i);
)||(
token>
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+"
}else{
filetextArea_2.append(strWord+"
strWord="
}
break;
}
}
/*
*判断数值,整型和浮点型
}elseif(token>
){
strWord=strWord+token;
while((token>
token>
)||token=='
.'
i++;
if(i<
token=line.charAt(i);
if((token>
token>
strWord=strWord+token;
}else{
if(look.lookFloatNum(strWord)){
filetextArea_2.append(strWord+"
浮点型\n"
break;
}else{
整型\n"
break;
}
}
}else{
if(look.lookFloatNum(strWord)){
break;
*判断运算符、关系运算符、分界符
}elseif(look.lookAWord(token)){
while(look.lookAWord(token)){
(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)){
filetextArea_2.append(strWord+"
运算符\n"
strWord="
i++;
break;
}elseif(look.lookRelationOpr(strWord)){
filetextArea_2.append(strWord+"
关系运算符\n"
i++;
break;
}elseif(look.lookBianjie(strWord)){
分界符\n"
}else{
}elseif(look.lookBianjie(strWord)){
strWord="
}else{
if(look.lookOperator(strWord)){
break;
}elseif(look.lookRelationOpr(strWord)){
filetextArea_2.append(strWord+"