1、(一)准备: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()int a,b;a = 10; b = a + 20;要求输出如右图。要求:识别保留
2、字:if、int、for、while、do、return、break、continue;单词种别码为1。其他的都识别为标识符;单词种别码为2。常数为无符号整形数;单词种别码为3。运算符包括:+、-、*、/、=、=、=、!= ;单词种别码为4。分隔符包括:,、;、(、); 单词种别码为5。以上为参考,具体可自行增删。(四)程序思路(仅供参考):这里以开始定义的C语言子集的源程序作为词法分析程序的输入数据。在词法分析中,自文件头开始扫描源程序字符,一旦发现符合“单词”定义的源程序字符串时,将它翻译成固定长度的单词内部表示,并查填适当的信息表。经过词法分析后,源程序字符串(源程序的外部表示)被翻译成
3、具有等长信息的单词串(源程序的内部表示),并产生两个表格:常数表和标识符表,它们分别包含了源程序中的所有常数和所有标识符。0.定义部分:定义常量、变量、数据结构。1.初始化:从文件将源程序全部输入到字符缓冲区中。2.取单词前:去掉多余空白。3.取单词后:去掉多余空白(可选,看着办)。4.取单词:利用实验一的成果读出单词的每一个字符,组成单词,分析类型。(关键是如何判断取单词结束?取到的单词是什么类型的单词?)5.显示结果。(五)练习该实验的目的和思路:程序开始变得复杂起来,可能是大家目前编过的程序中最复杂的,但相对于以后的程序来说还是简单的。因此要认真把握这个过渡期的练习。本实验和以后的实验相
4、关。通过练习,掌握对字符进行灵活处理的方法。(六)为了能设计好程序,注意以下事情:1.模块设计:将程序分成合理的多个模块(函数),每个模块做具体的同一事情。2.写出(画出)设计方案:模块关系简图、流程图、全局变量、函数接口等。3.编程时注意编程风格:空行的使用、注释的使用、缩进的使用等。四、上交:1.程序源代码和实验文档(电子版提交到ftp);2.已经测试通过的测试数据3组;3.实验报告(纸质):实验名称实验目的和要求(一)实验内容(1)功能描述:该程序具有什么功能?(2)程序结构描述:函数调用格式、参数含义、返回值描述、函数功能;函数之间的调用关系图。(3)程序总体执行流程图(二)实验过程记
5、录:出错次数、出错严重程度、解决办法摘要。(三)实验总结:你在编程过程中花时多少?多少时间在纸上设计?多少时间上机输入和调试?多少时间在思考问题?遇到了哪些难题?你是怎么克服的?你对你的程序的评价?你的收获有哪些?import java.awt.*;import java.awt.event.*;import java.io.*;import javax.swing.*;import javax.swing.JOptionPane;public class Compiler extends JFrame implements ActionListener int row = 1; int li
6、ne = 1; int err=0; JMenuBar mb = new JMenuBar(); JMenu fileMenu = new JMenu(文件); JMenu actionMenu = new JMenu(词法分析 JMenuItem closeWindow = new JMenuItem(退出 JMenuItem openFile = new JMenuItem(打开 JMenuItem lexical_check = new JMenuItem(开始 int begin = 0; int end = 0; TextArea text = new TextArea(); Tex
7、tArea error_text = new TextArea(); TextArea end_text = new TextArea(); FileDialog file_dialog_load = new FileDialog(this, Open file., FileDialog.LOAD); JPanel pan1=new JPanel(); JPanel pan2=new JPanel(); Compiler() this.add(end_text);end_text.setEditable(false); this.add(text); this.add(error_text);
8、error_text.setEditable(false); pan1.setLayout(new GridLayout(1,1); pan1.add(text); pan2.setLayout(new GridLayout(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); fileMen
9、u.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(new WindowAdapter() publi
10、c void windowClosing(WindowEvent e) System.exit(0); ); this.setVisible(true); public static void main(String args) Compiler compiler = new Compiler(); public void actionPerformed(ActionEvent e) if (e.getSource() = closeWindow) int flag = JOptionPane.showConfirmDialog(null, 是否退出 System.out.println(fl
11、ag= + flag); if (flag = 0) else if (flag = 1) else if(e.getSource() = openFile) file_dialog_load.setVisible(true); File myfile = new File(file_dialog_load.getDirectory(), file_dialog_load.getFile(); try BufferedReader bufReader = new BufferedReader(new FileReader(myfile); String content = ; String s
12、tr; while(str = bufReader.readLine() != null) content += str + n text.setText(content); catch(IOException ie)IOexception occurs. else if(e.getSource() = lexical_check) row = 0; line = 1; checkLexical(); public void checkLexical() String error_info = error_text.getText(); String content = text.getTex
13、t(); if(content.equals() error_info += 文 件 尚 未 载 入 ! error_text.setText(error_info); else int i = 0;/选择第i个字符进行检测。 int N = content.length();/文件大小 int state = 0;/状态标志 for(i = 0; i ) state = 6;) state = 7;=) state = 8; else if(c=.) state=17;) state=18;%) state=19;) state=20; else if(int)c) = 10) state
14、= 9;/输入为回车Line+line+nn else if(isLetter(c) state = 10; begin = i; else if(isDigit(c) state = 11;#) state = 12;) state = 14;|) state = 15;) state = 16; else err+; String a=end_text.getText(); a+=错误: line: + line + row: + row + error: + c + Undefined character! n end_text.setText(a); break; case 1:/标志
15、符是 +)t运算符tt401 t+t运算符tt402 t+= else if(isDigit(content.charAt(i - 2)t200 content.substring(begin, i-1) + t运算符tt403 t+ i-; row-; case 2:/标志符是 -t运算符tt404 t-t运算符tt405 t-=t运算符tt423 t- elset运算符tt406 t- case 3:/标志符是 *t运算符tt407 t*=t运算符tt408 t* case 4:/标志符是 / while(c) != c = content.charAt(i); i+;t注释部分tt/ n
16、 else if(c = t运算符tt409 t/=t运算符tt410 t/ /state = 0; case 5:/标志符是 !t运算符tt411 t!=t运算符tt412 case 6:/标志符是 t运算符tt413 tt运算符tt426 state=0;t运算符tt414 case 7:/标志符是 t运算符tt415 tt运算符tt427 t运算符tt416 case 8:/标志符是 =t运算符tt417 t=t运算符tt418 t= case 9:/标志符是 回车 row = 1; line +; case 10:/标志符是 字母 if(isLetter(c) | isDigit(c) String id = content.substring(begin, end); if(isKey(id)!=0) int t=isKey(id);t关键字tt+t+ id + elset标志符tt100+id + case 11:/标志符是 数字eE state = 13; else if(isDigit(c) | c = /省略跳过,i加一操作 else if(isLetter(c) String b=end_text.getText();
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2