实验一词法分析文档格式.docx

上传人:b****3 文档编号:8292589 上传时间:2023-05-10 格式:DOCX 页数:22 大小:41.94KB
下载 相关 举报
实验一词法分析文档格式.docx_第1页
第1页 / 共22页
实验一词法分析文档格式.docx_第2页
第2页 / 共22页
实验一词法分析文档格式.docx_第3页
第3页 / 共22页
实验一词法分析文档格式.docx_第4页
第4页 / 共22页
实验一词法分析文档格式.docx_第5页
第5页 / 共22页
实验一词法分析文档格式.docx_第6页
第6页 / 共22页
实验一词法分析文档格式.docx_第7页
第7页 / 共22页
实验一词法分析文档格式.docx_第8页
第8页 / 共22页
实验一词法分析文档格式.docx_第9页
第9页 / 共22页
实验一词法分析文档格式.docx_第10页
第10页 / 共22页
实验一词法分析文档格式.docx_第11页
第11页 / 共22页
实验一词法分析文档格式.docx_第12页
第12页 / 共22页
实验一词法分析文档格式.docx_第13页
第13页 / 共22页
实验一词法分析文档格式.docx_第14页
第14页 / 共22页
实验一词法分析文档格式.docx_第15页
第15页 / 共22页
实验一词法分析文档格式.docx_第16页
第16页 / 共22页
实验一词法分析文档格式.docx_第17页
第17页 / 共22页
实验一词法分析文档格式.docx_第18页
第18页 / 共22页
实验一词法分析文档格式.docx_第19页
第19页 / 共22页
实验一词法分析文档格式.docx_第20页
第20页 / 共22页
亲,该文档总共22页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

实验一词法分析文档格式.docx

《实验一词法分析文档格式.docx》由会员分享,可在线阅读,更多相关《实验一词法分析文档格式.docx(22页珍藏版)》请在冰点文库上搜索。

实验一词法分析文档格式.docx

(一)准备:

1.阅读课本有关章节,明确语言的语法,写出基本保留字、标识符、常数、运算符、分隔符和程序例。

2.初步编制好程序。

3.准备好多组测试数据。

(二)上课上机:

将源代码拷贝到机上调试,发现错误,再修改完善。

第二次上机调试通过。

(三)程序要求:

程序输入/输出示例:

(2,”main”)

(5,”(“)

(5,”)“)

(5,”{“)

(1,”int”)

(2,”a”)

(5,”,”)

(2,”b”)

(5,”;

”)

(4,”=”)

(3,”10”)

(4,”+”)

(3,”20”)

(5,”}“)

如源程序为C语言。

输入如下一段:

main()

{

inta,b;

a=10;

b=a+20;

}

要求输出如右图。

要求:

识别保留字:

if、int、for、while、do、return、break、continue;

单词种别码为1。

其他的都识别为标识符;

单词种别码为2。

常数为无符号整形数;

单词种别码为3。

运算符包括:

+、-、*、/、=、>

、<

、>

=、<

=、!

=;

单词种别码为4。

分隔符包括:

、;

、{、}、(、);

单词种别码为5。

以上为参考,具体可自行增删。

(四)程序思路(仅供参考):

这里以开始定义的C语言子集的源程序作为词法分析程序的输入数据。

在词法分析中,自文件头开始扫描源程序字符,一旦发现符合“单词”定义的源程序字符串时,将它翻译成固定长度的单词内部表示,并查填适当的信息表。

经过词法分析后,源程序字符串(源程序的外部表示)被翻译成具有等长信息的单词串(源程序的内部表示),并产生两个表格:

常数表和标识符表,它们分别包含了源程序中的所有常数和所有标识符。

0.定义部分:

定义常量、变量、数据结构。

1.初始化:

从文件将源程序全部输入到字符缓冲区中。

2.取单词前:

去掉多余空白。

3.取单词后:

去掉多余空白(可选,看着办)。

4.取单词:

利用实验一的成果读出单词的每一个字符,组成单词,分析类型。

(关键是如何判断取单词结束?

取到的单词是什么类型的单词?

5.显示结果。

(五)练习该实验的目的和思路:

程序开始变得复杂起来,可能是大家目前编过的程序中最复杂的,但相对于以后的程序来说还是简单的。

因此要认真把握这个过渡期的练习。

本实验和以后的实验相关。

通过练习,掌握对字符进行灵活处理的方法。

(六)为了能设计好程序,注意以下事情:

1.模块设计:

将程序分成合理的多个模块(函数),每个模块做具体的同一事情。

2.写出(画出)设计方案:

模块关系简图、流程图、全局变量、函数接口等。

3.编程时注意编程风格:

空行的使用、注释的使用、缩进的使用等。

四、上交:

1.程序源代码和实验文档(电子版提交到ftp);

2.已经测试通过的测试数据3组;

3.实验报告(纸质):

实验名称

实验目的和要求

(一)实验内容

(1)功能描述:

该程序具有什么功能?

(2)程序结构描述:

函数调用格式、参数含义、返回值描述、函数功能;

函数之间的调用关系图。

(3)程序总体执行流程图

(二)实验过程记录:

出错次数、出错严重程度、解决办法摘要。

(三)实验总结:

你在编程过程中花时多少?

多少时间在纸上设计?

多少时间上机输入和调试?

多少时间在思考问题?

遇到了哪些难题?

你是怎么克服的?

你对你的程序的评价?

你的收获有哪些?

importjava.awt.*;

importjava.awt.event.*;

importjava.io.*;

importjavax.swing.*;

importjavax.swing.JOptionPane;

publicclassCompilerextendsJFrameimplementsActionListener{

introw=1;

intline=1;

interr=0;

JMenuBarmb=newJMenuBar();

JMenufileMenu=newJMenu("

文件"

);

JMenuactionMenu=newJMenu("

词法分析"

JMenuItemcloseWindow=newJMenuItem("

退出"

JMenuItemopenFile=newJMenuItem("

打开"

JMenuItemlexical_check=newJMenuItem("

开始"

intbegin=0;

intend=0;

TextAreatext=newTextArea();

TextAreaerror_text=newTextArea();

TextAreaend_text=newTextArea();

FileDialogfile_dialog_load=newFileDialog(this,"

Openfile..."

FileDialog.LOAD);

JPanelpan1=newJPanel();

JPanelpan2=newJPanel();

Compiler(){

this.add(end_text);

end_text.setEditable(false);

this.add(text);

this.add(error_text);

error_text.setEditable(false);

pan1.setLayout(newGridLayout(1,1));

pan1.add(text);

pan2.setLayout(newGridLayout(2,1));

pan2.add(error_text,"

North"

pan2.add(end_text,"

South"

getContentPane().add(pan1,"

West"

getContentPane().add(pan2,"

Center"

this.setJMenuBar(mb);

mb.add(fileMenu);

mb.add(actionMenu);

fileMenu.add(openFile);

fileMenu.add(closeWindow);

actionMenu.add(lexical_check);

error_text.setText("

----------------------------------------------词法分析结果-------------------------------------------\n"

end_text.setText("

--------------------------------------------词法分析错误信息--------------------------------------\n"

closeWindow.addActionListener(this);

openFile.addActionListener(this);

lexical_check.addActionListener(this);

pack();

this.addWindowListener(newWindowAdapter(){

publicvoidwindowClosing(WindowEvente){

System.exit(0);

}

});

this.setVisible(true);

publicstaticvoidmain(String[]args){

Compilercompiler=newCompiler();

publicvoidactionPerformed(ActionEvente){

if(e.getSource()==closeWindow){

intflag=JOptionPane.showConfirmDialog(null,"

是否退出"

System.out.println("

flag="

+flag);

if(flag==0){

}elseif(flag==1){

}elseif(e.getSource()==openFile){

file_dialog_load.setVisible(true);

Filemyfile=newFile(file_dialog_load.getDirectory(),file_dialog_load.getFile());

try{

BufferedReaderbufReader=newBufferedReader(newFileReader(myfile));

Stringcontent="

"

;

Stringstr;

while((str=bufReader.readLine())!

=null){

content+=str+"

\n"

text.setText(content);

}catch(IOExceptionie){

IOexceptionoccurs..."

}elseif(e.getSource()==lexical_check){

row=0;

line=1;

checkLexical();

publicvoidcheckLexical(){

Stringerror_info=error_text.getText();

Stringcontent=text.getText();

if(content.equals("

)){

error_info+="

文件尚未载入!

error_text.setText(error_info);

}else{

inti=0;

//选择第i个字符进行检测。

intN=content.length();

//文件大小

intstate=0;

//状态标志

for(i=0;

i<

N;

i++){//对所有字符进行检测

row++;

charc=content.charAt(i);

switch(state){

case0:

if(c=='

'

||c=='

'

\t'

{'

||c=='

}'

('

||

c=='

)'

'

['

]'

){

if(isDigit(content.charAt(i-1))&

&

isDigit(content.charAt(begin))){

end=i;

error_text.append("

\t数值\t"

+"

200"

+

content.substring(begin,end)+'

\n'

if(c=='

)error_text.append("

\t界符\t"

+"

\t501"

\t,"

+'

\t502"

\t;

\t503"

\t{"

\t504"

\t}"

\t505"

\t("

\t506"

\t)"

\t508"

\t["

\t509"

\t]"

state=0;

}elseif(c=='

)state=1;

elseif(c=='

-'

)state=2;

*'

)state=3;

/'

)state=4;

!

)state=5;

>

)state=6;

)state=7;

='

)state=8;

elseif(c=='

.'

)state=17;

~'

)state=18;

%'

)state=19;

^'

)state=20;

elseif(((int)c)==10){

state=9;

//输入为回车

Line"

+line+"

\n\n"

}elseif(isLetter(c)){

state=10;

begin=i;

elseif(isDigit(c)){

state=11;

#'

)state=12;

)state=14;

|'

)state=15;

)state=16;

else{

err++;

Stringa=end_text.getText();

a+="

错误:

line:

"

+line+"

row:

+row+"

error:

+c+"

Undefinedcharacter!

\n"

end_text.setText(a);

break;

case1:

//标志符是+

){

\t运算符\t\t401"

\t++"

\t运算符\t\t402"

\t+="

}else{

if(isDigit(content.charAt(i-2)))

\t200"

content.substring(begin,i-1)+'

\t运算符\t\t403"

\t+"

i--;

row--;

case2:

//标志符是-

\t运算符\t\t404"

\t--"

\t运算符\t\t405"

\t-="

\t运算符\t\t423"

\t->

else{

\t运算符\t\t406"

\t-"

case3:

//标志符是*

\t运算符\t\t407"

\t*="

\t运算符\t\t408"

\t*"

case4:

//标志符是/

while((c)!

='

c=content.charAt(i);

i++;

\t注释部分\t\t//\n"

}elseif(c=='

\t运算符\t\t409"

\t/="

\t运算符\t\t410"

\t/"

//state=0;

case5:

//标志符是!

\t运算符\t\t411"

\t!

="

\t运算符\t\t412"

case6:

//标志符是>

\t运算符\t\t413"

\t>

\t运算符\t\t426"

state=0;

\t运算符\t\t414"

case7:

//标志符是<

\t运算符\t\t415"

\t<

\t运算符\t\t427"

\t运算符\t\t416"

case8:

//标志符是=

\t运算符\t\t417"

\t=="

\t运算符\t\t418"

\t="

case9:

//标志符是回车

row=1;

line++;

case10:

//标志符是字母

if(isLetter(c)||isDigit(c)){

Stringid=content.substring(begin,end);

if(isKey(id)!

=0){

intt=isKey(id);

\t关键字\t\t"

+t+id+'

}else

\t标志符\t"

\t100"

+id+'

case11:

//标志符是数字

e'

E'

state=13;

elseif(isDigit(c)||c=='

//省略跳过,i加一操作

}else{

if(isLetter(c)){

Stringb=end_text.getText();

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

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2