编译器的词法分析器
- 格式:doc
- 大小:97.00 KB
- 文档页数:8
一.实验目的
●了解编译器的词法分析器的作用。其作用是源程序转化为便于编译程序其余部分进行处
理的内部格式。
●了解词法分析器的任务。识别出源程序中的各个基本语法单位;删除无用的空白字符,
回车以及其他与输入介质相关的非实质性的字符,以及注释等。
一.实验说明
●词法分析程序:词法分析程序完成的是编译第一阶段的工作。词法分析工作可以是独立
的一遍,把字符流的源程序变为单词序列,输出在一个中间文件上,这个文件做为语法分析程序的输入而继续编译过程。然而,更一般的情况,是将词法分析程序设计成一个子程序,每当语法分析程序需要一个单词时,则调用该子程序。词法分析程序每得到一次调用,便从源程序文件中读入一些字符,直到识别出一个单词,或说直到下一单词的第一个字符为止。
●词法分析程序的主要功能是从字符流的源程序中识别单词,它要从左至右逐个字符地扫
描源程序,因此它还可完成其它一些任务。比如,滤掉源程序中的注释和空白(由空格,制表或回车换行字符引起的空白);又比如,为了使编译程序能将发现的错误信息与源程序的出错位置联系起来,词法分析程序负责记录新读入的字符行的行号,以便行号与出错信息相联;再有,在支持宏处理功能的源语言中,可以由词法分析程序完成其预处理等等。
●以下是五种单词符号:
- 保留字,关键字
- 标识符
- 常数(量)
- 运算符
- 界符
●词法分析程序所输出的单词符号常常采用以下二元式表示:(单词种别,单词自身的值)。
单词的种别是语法分析需要的信息,而单词自身的值则是编译其它阶段需要的信息。比如在PASCAL的语句const i=25, yes=1;中的单词25和1的种别都是常数,常数的值25和1对于代码生成来说,是必不可少的。有时,对某些单词来说,不仅仅需要它的值,还需要其它一些信息以便编译的进行。比如,对于标识符来说,还需要记载它的类别、层次还有其它属性,如果这些属性统统收集在符号表中,那么可以将单词的二元式表示设计成如下形式(标识符,指向该标识符所在符号表中位置的指针),如上述语句中
的单词i和yes的表示为:
(标识符,指向i的表项的指针)
(标识符,指向yes的表项的指针)
●实际上,词法也是语法的一部分,词法描述完全可以归并到语法描述中去,只不过词法
规则更简单些。这在后面的章节中可以看到。为什么将词法分析做为一个独立的阶段?
为什么把编译过程的分析工作划分成词法分析和语法分析两个阶段?主要的考虑因素为:
①使整个编译程序的结构更简洁、清晰和条理化。
②编译程序的效率会改进。
③增强编译程序的可移植性。
二.实验要求
对于如下文法所定义的PASCAL语言子集,试编写一个词法分析程序:
<程序>—><变量说明>BEGIN<词句表>END。
<变量说明>—><变量>,<变量>|<变量>。
<类型>—>INTEGER。
………
………
(1)。单词的分类:可将所有标志符归为一类;将常数归为一类;保留字和分隔符则可采取一词一类。
(2)。符号表的建立:可事先建立一保留字表,以备在识别保留字时进行查询。变量名及常数表则在词法分析过程中建立。
(3)。单词串的输出形式:所有输出单词都用二元组形式。
四.程序设计思路
●实现语言:JA V A
●从源文件读入源代码字符然后进行扫描,第一次扫描去空格,注释,换行,回车等,分
离出数字,关键字,标志符;第二次扫描分离出标点与运算符。
●经过两次扫描分离出四种类型的单词符号,把关键字,标志符,特殊符号,数字分别保
存在一个表中。
●显示结果
●由于采用两次扫描,所以输出结果与书上不同。先关键字,标志符,数字三者然后特殊
符号。
流程图如下:
五.程序代码
package Analyser;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.util.*;
public class Analyser extends JFrame implements Runnable
{
//保留关键字的数组
private static final String keyWord[]={"PROGRAM","V AR","BEGIN", "END", "integer", "DIV"};
private JTextArea displayTA,resultTA;
private JFileChooser filechooser;
private JButton open,convert;
//记录文本的行数
private int col;
//记录文本内容
private String content;
//creat GUI
private HashTable key;//记录关键字的哈希表
private HashTable identifer;//记录标志符的哈希表
private HashTable digi;//记录数字的哈希表
private HashTable token;//记录符号的哈希表
public Analyser()
{
super("扫描器");
key=new HashTable ();
identifer=new HashTable ();
digi=new HashTable ();
token=new HashTable ();
final Container c=this.getContentPane();
JMenuBar mb=new JMenuBar();
JMenu help=new JMenu("Help");
help.setMnemonic('H');
JMenuItem introduction=new JMenuItem("说明");
introduction.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
JOptionPane.showMessageDialog(c,"上面文本区显示文件内容,下面文本区显示分析结果");
}