编译原理词法分析器实现

  • 格式:doc
  • 大小:171.00 KB
  • 文档页数:12

下载文档原格式

  / 12
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验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();