编译原理词法分析器实现
- 格式:doc
- 大小:171.00 KB
- 文档页数:12
实验1《词法分析程序设计与实现》
一、实验目的
加深对词法分析器的工作过程的理解;加强对词法分析方法的掌握;能够采用一种编程语言实现简单的词法分析程序;能够使用自己编写的分析程序对简单的程序段进行词法分析。
二、实验内容
自定义一种程序设计语言,或者选择已有的一种高级语言,编制它的词法分析程序。词法分析程序的实现可以采用任何一种编程语言和编程工具。
从输入的源程序中,识别出各个具有独立意义的单词,即关键字、标识符、常数、运算符、界符。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续显示)
三、实验方法
通过自定义一组符号表,存储到属性文件中,然后使用一些if和else语句来判断所获取的字符的类型,并输出相应的码。
四、实验步骤
1.定义目标语言的可用符号表和构词规则;
2.依次读入源程序符号,对源程序进行单词切分和识别,直到源程序结束;
3.对正确的单词,按照它的种别以<种别码,值>的形式保存在符号表中;
4.对不正确的单词,做出错误处理。
五、实验结果
项目截图:
六、实验结论
源代码如下:
这是Lexer类:
package 词法分析程序;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class Lexer {
private static String TITLE = "欢迎使用本系统!";
boolean flag = false;
int x = -250, y = 50;
private int code = 0;
private char[] ch;
private String strToken = "";
private StringBuffer sb = new StringBuffer(strToken);
private JTextArea inputArea, statusArea;
/**
* 构造器创建swing操作界面
*/
public Lexer() {
// 创建符号表,初次运行时请执行下面的函数
// createProperty();
JFrame frame = new JFrame("词法分析器");
frame.setDefaultCloseOperation(3);
frame.setSize(500, 550);
frame.setLocationRelativeTo(null);
final JPanel north = new JPanel();
north.setPreferredSize(new Dimension(0, 100));
inputArea = new JTextArea();
inputArea.setFont(new Font("", Font.BOLD, 18));
inputArea.setBorder(BorderFactory.createTitledBorder("代码框"));
JScrollPane js1 = new JScrollPane(inputArea);
statusArea = new JTextArea();
statusArea.setEditable(false);
statusArea.setBorder(BorderFactory.createTitledBorder("状态框"));
statusArea.setFont(new Font("", Font.PLAIN, 15));
JScrollPane js2 = new JScrollPane(statusArea);
js2.setPreferredSize(new Dimension(150, 500));
JPanel jPanel = new JPanel();
JButton start = new JButton("开始分析");
JButton clear = new JButton("清空");
jPanel.add(start);
jPanel.add(clear);
frame.add(north, BorderLayout.NORTH);
frame.add(js1, BorderLayout.CENTER);
frame.add(js2, BorderLayout.EAST);
frame.add(jPanel, BorderLayout.SOUTH);
frame.setVisible(true);
final Graphics g = north.getGraphics();
new Thread() {
public void run() {
BufferedImage bf = new BufferedImage(north.getWidth(), north
.getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics gg = bf.getGraphics();
gg.setFont(new Font("华文行楷", Font.ITALIC, 25));
while (true) {
try {
Thread.sleep(10);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
if (flag) {
continue;
}
gg.drawImage(new ImageIcon("images/sky.jpg").getImage(), 0,
0, null);
gg.drawString(TITLE, x, y);
x++;
if (x > north.getWidth())
x = -250;
g.drawImage(bf, 0, 0, null);
}
}
}.start();