原版第2组编译原理实验报告.docx

上传人:b****5 文档编号:6812429 上传时间:2023-01-10 格式:DOCX 页数:37 大小:298.15KB
下载 相关 举报
原版第2组编译原理实验报告.docx_第1页
第1页 / 共37页
原版第2组编译原理实验报告.docx_第2页
第2页 / 共37页
原版第2组编译原理实验报告.docx_第3页
第3页 / 共37页
原版第2组编译原理实验报告.docx_第4页
第4页 / 共37页
原版第2组编译原理实验报告.docx_第5页
第5页 / 共37页
点击查看更多>>
下载资源
资源描述

原版第2组编译原理实验报告.docx

《原版第2组编译原理实验报告.docx》由会员分享,可在线阅读,更多相关《原版第2组编译原理实验报告.docx(37页珍藏版)》请在冰豆网上搜索。

原版第2组编译原理实验报告.docx

原版第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="";

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1