词法分析器设计文档格式.docx
- 文档编号:19761138
- 上传时间:2023-01-09
- 格式:DOCX
- 页数:32
- 大小:125.74KB
词法分析器设计文档格式.docx
《词法分析器设计文档格式.docx》由会员分享,可在线阅读,更多相关《词法分析器设计文档格式.docx(32页珍藏版)》请在冰豆网上搜索。
end"
if"
else"
for"
"
char"
to"
do"
then"
(2)运算符
="
<
++"
:
|"
*"
+"
%"
-"
/"
(3)界符
;
{"
}"
("
)"
(4)标识符
以字母或下划线开头的字符串表示
(5)常量
用数字表示
(6)空格、回车、换行符跳过
3、在屏幕上显示如下:
(1)Token表中显示:
1program保留字
1example保留字
1;
界符
2const保留字
2k标识符
2=运算符
2200常量
(2)错误信息显示:
2errors
42a格式不正确
4034不能以0开头
三、实验需求
1、界面部分:
需要对文件有打开、保存、另存为的功能;
对文本有撤销、剪切、复制、粘贴、复制、删除、全选的功能
2、词法分析器:
对读入的程序一个字符一个字符的进行词法分析,识别出一个个单词符号,并以三元式(单词行号,单词符号的属性值,单词符号类别)显示。
4、主要数据结构介绍
使用三个数组分别来存放关键字、运算符、界符,凡是不属于这三个数组的所有合法字符串当做标识符处理,凡是不属于这三个数组的所有合法数字当做常量处理,其余情况则进行出错处理
5、主要模块算法介绍
1、对输入的程序进行处理:
空格、回车、换行符跳过,并按照"
、"
等符号将字符串切割开来,同时对字符串使用toCharArray()转换成单个字符,求出切割符号在字符串中的位置,并将它们与切割好的字符串重新组合,使它们与输入程序相同
2、对第一步得到的字符串数组进行一个一个的检查,如果字符串在table1中,则表明是运算符,将状态标记为1;
如果字符串在table2中,则表明是保留字,将状态标记为2;
如果字符串在table3中,则表明是界符,将状态标记为3
3、如果对当前的字符串不在这三个数组中,且数字序列又是合法的,则表明是常量,将状态标记为4;
如果对当前的字符串不在这三个数组中,且字符序列又是合法的,则表明是标识符,将状态标记为5
4、如果对当前的输入不满足前5个状态,且字符序列不是以下划线、字母开头,则表明输入的格式不正确,将状态标记为6;
如果对当前的输入不满足前5个状态,且字符序列是以0开头的数字序列,则表明输入的常量是以0开头的,这是非法格式,将状态标记为7
5、将最终的结果打印输出到文本框中
6、程序实现环境及使用说明
本次实验采用Eclipse进行代码的编写、编译及运行;
编写语言为java语言;
程序的运行环境为jdk1.8;
系统为windows
8.1
7、实验测试用例设计说明
1、正常的测试,这种情况下不会报错
programexample;
constk=2;
var
a:
interger;
begin
end
2、错误的测试,这个例子中含有非法标识符和非法常量的错误
constk=2a,c=300,d=034;
八、实验结果测试情况
9、小组对实验结果的自我评价
通过这次实验,我对词法分析器有了一定的了解,进一步的巩固了这部分的知识。
懂得了词法分析器的工作原理。
在编程过程中,遇到了不少的问题,在同学的帮助下,问题一步一步的得到了解决。
先从实现最简单的扫描和输出,再实现扫描的范围扩大和输出的结果更加具体,虽然词法分析器的功能实现了,但是对于小数不能进行较好的分析。
在算法上虽然是弄懂了词法分析器,但具体实现起来还有一些不足。
由于编程能力和时间的不足,这个分析器还有待完善,没有把双目运算符考虑进来。
对于出错处理也考虑得不够周到。
望老师多多指教。
十、任课教师对实验结果的评分
源码
FrameView.java
packageview;
importjava.awt.BorderLayout;
importjava.awt.Event;
importjava.awt.FileDialog;
importjava.awt.FlowLayout;
importjava.awt.Font;
importjava.awt.GridLayout;
importjava.awt.ScrollPane;
importjava.awt.datatransfer.Clipboard;
importjava.awt.datatransfer.DataFlavor;
importjava.awt.datatransfer.StringSelection;
importjava.awt.datatransfer.Transferable;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.awt.event.KeyEvent;
importjava.awt.event.MouseAdapter;
importjava.awt.event.MouseEvent;
importjava.awt.event.WindowAdapter;
importjava.awt.event.WindowEvent;
importjava.io.BufferedReader;
importjava.io.BufferedWriter;
importjava.io.File;
importjava.io.FileReader;
importjava.io.FileWriter;
importjava.io.IOException;
importjavax.swing.JFrame;
importjavax.swing.JMenu;
importjavax.swing.JMenuBar;
importjavax.swing.JMenuItem;
importjavax.swing.JOptionPane;
importjavax.swing.JPanel;
importjavax.swing.JPopupMenu;
importjavax.swing.JTextArea;
importjavax.swing.KeyStroke;
importjavax.swing.event.DocumentEvent;
importjavax.swing.event.DocumentListener;
importjavax.swing.event.UndoableEditEvent;
importjavax.swing.event.UndoableEditListener;
importjavax.swing.undo.UndoManager;
importoperation.Analysis;
publicclassFrameViewextendsJFrameimplementsActionListener,
DocumentListener,UndoableEditListener{
JFramef=newJFrame("
词法分析器"
);
ScrollPanejspa=newScrollPane();
ScrollPanejspb=newScrollPane();
ScrollPanejspc=newScrollPane();
JPopupMenupop=newJPopupMenu();
JTextAreata=newJTextArea();
JTextAreatb=newJTextArea();
JTextAreatc=newJTextArea();
JPanelpa=newJPanel();
JPanelpb=newJPanel();
JOptionPanejop=newJOptionPane();
UndoManagerum=newUndoManager();
JMenuBarbar=newJMenuBar();
JMenufile=newJMenu("
文件"
JMenuedit=newJMenu("
编辑"
JMenuanalysis=newJMenu("
词法分析"
JMenuhelp=newJMenu("
帮助"
JMenuItemopen=newJMenuItem("
打开"
JMenuItemsave=newJMenuItem("
保存"
JMenuItemsaveNew=newJMenuItem("
另存为"
JMenuItemexit=newJMenuItem("
退出"
JMenuItemback=newJMenuItem("
撤销"
JMenuItemcut=newJMenuItem("
剪切"
JMenuItemcopy=newJMenuItem("
复制"
JMenuItempaste=newJMenuItem("
粘贴"
JMenuItemdel=newJMenuItem("
删除"
JMenuItemall=newJMenuItem("
全选"
JMenuItemlexical=newJMenuItem("
JMenuItemsHelp=newJMenuItem("
查看帮助"
JMenuItemabout=newJMenuItem("
关于"
JMenuItemback1=newJMenuItem("
JMenuItemcut1=newJMenuItem("
JMenuItemcopy1=newJMenuItem("
JMenuItempaste1=newJMenuItem("
JMenuItemdel1=newJMenuItem("
JMenuItemall1=newJMenuItem("
FileDialogopenDia=newFileDialog(f,"
FileDialog.LOAD);
FileDialogsaveDia=newFileDialog(f,"
FileDialog.SAVE);
AboutFileprompta;
Filefe;
Clipboardclipboard=null;
booleanisSave,change,isLine;
Stringselect;
publicFrameView(){
isSave=false;
change=false;
isLine=true;
setup();
f.addWindowListener(newWindowAdapter(){
publicvoidwindowClosing(WindowEventwe){
if((isSave==false)&
&
(change==true)){
Promptdg=newPrompt(f,"
true);
}else
System.exit(0);
}
});
ta.setFont(newFont("
宋体"
0,20));
ta.setLineWrap(true);
tb.setEditable(false);
tc.setEditable(false);
pack();
f.setBounds(300,100,750,550);
f.setVisible(true);
}
publicvoidsetup(){
setLayout(newBorderLayout());
f.setJMenuBar(bar);
jspa.add(ta);
jspb.add(tb);
jspc.add(tc);
pb.setLayout(newGridLayout(2,1));
pb.add(jspb);
pb.add(jspc);
pa.setLayout(newGridLayout(1,2));
pa.add(jspa);
pa.add(pb);
f.add(pa);
bar.add(file);
bar.add(edit);
bar.add(analysis);
bar.add(help);
file.add(open);
file.add(save);
file.add(saveNew);
file.addSeparator();
file.add(exit);
edit.add(back);
edit.addSeparator();
edit.add(cut);
edit.add(copy);
edit.add(paste);
edit.add(del);
edit.add(all);
analysis.add(lexical);
help.add(sHelp);
help.add(about);
pop.add(back1);
pop.addSeparator();
pop.add(cut1);
pop.add(copy1);
pop.add(paste1);
pop.add(del1);
pop.add(all1);
open.setMnemonic('
O'
open.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,
Event.CTRL_MASK));
save.setMnemonic('
S'
save.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,
saveNew.setMnemonic('
A'
saveNew.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A,
Event.SHIFT_MASK));
exit.setMnemonic('
X'
exit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X,
back.setMnemonic('
Z'
back.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z,
cut.setMnemonic('
cut.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X,
copy.setMnemonic('
C'
copy.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,
paste.setMnemonic('
V'
paste.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V,
del.setMnemonic('
L'
del.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE,0));
all.setMnemonic('
all.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A,
lexical.setMnemonic('
lexical.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_L,
sHelp.setMnemonic('
H'
sHelp.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_H,
about.setMnemonic('
B'
about.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_B,
back1.setMnemonic('
back1.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z,
cut1.setMnemonic('
cut1.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X,
copy1.setMnemonic('
copy1.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,
paste1.setMnemonic('
paste1.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V,
del1.setMnemonic('
del1.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE,0));
all1.setMnemonic('
all1.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A,
open.addActionListener(this);
save.addActionListener(this);
saveNew.addActionListener(this);
exit.addActionListener(this);
back.addActionListener(this);
cut.addActionListener(this);
copy.addActionListener(this);
paste.addActionListener(this);
del.addActionListener(this);
all.addActionListener(this);
lexical.addActionListener(this);
about.addActionListener(this);
sHelp.addActionListener(this);
back1.addActionListener(this);
cut1.addActionListener(this);
copy1.addActionListener(this);
paste1.addActionListener(this);
del1.addActionListener(this);
all1.addActionListener(this);
ta.getDocument().addDocumentListener(this);
ta.getDocument().addUndoableEditListener(this);
ta.addMouseListener(newMouseAdapter(){
publicvoidmousePressed(MouseEventme){
if(me.getButton()==me.BUTTON3){
pop.show(ta,me.getX(),me.getY());
}
publicvoidopenFile(){
openDia.setVisible(true);
StringdirPath=openDia.getDirectory();
StringfileName=openDia.getFile();
if(dirPath==null||fileName==null)
return;
ta.setText("
fe=newFile(dirPath,fileName);
try{
Bu
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 词法 分析器 设计
![提示](https://static.bdocx.com/images/bang_tan.gif)