题目:词法分析器编译预处理程序
目的:通过完成词法分析程序,了解词法分析的过程
实验内容:用
java
实现对词法分析器编译预处理程序子程集程序设计语言的语法识别程序
实验要求:将该语言的源程序,也就是相应字符流程序转换分析
词法分析器编译预处理设计思想:为了实现的便宜程序实用,这里规定源程序可采用自由书写格式,即一行内可以书写多个语句,一个语句可以占领多行书写;表示符的前
20
个字符有效;整数用
2
个字节表示;长整数用
4
个字节表示。这样的词法分析器的主要工作内容是(由于时间太仓促,解吸语句自己在程序中更改):
(
1
)
从源程序文件中读入字符。
(
2
)
统计行数和列数用于错误单词的定位。
(
3
)
删除空格类字符,包括回车、制表符空格。
(
4
)
按拼写单词,并用(内码,属性)二元式表示
(
5
)
根据需要是否填写表识符表供以后各阶段使用
这里采用的编译程序的实现是一遍扫描,即从左到右只扫描依次源程序,也就是词法分析作为语法分析的一个子程序。故在编写词法分析程序时,用重复调用词法分析子程序取一单词的方法得到整个源程序得到整个程序的内码流。扫描程序流程图
流程图:待传
实验结果:待传
总结:
本程序特殊符号:
'/n' ',' ' ' '/t' '{' '}' '(' ')' ';' '=' '+' '-' '*' '/'
关键字:
int real for while do begin end if then AND OR NOT repeat until read write return true false boolean program const to
字母以及数字进行词法分析,对源代码进行编译预处理将注析部分消除,程序成功运行
不足之处:匆促只中难免有些不足之处,不能将代码进行词法的分析的记录进行保存,
在编译预处理部分只能对
“//”
进行处理
未能对
“/* */”
进行处理,以及对编译部分在处理
“
;
”
符号时候是将程序中;符号前打一空格。
通过本次学习,自己学习到如何编写
java Applictaion
程序,了解了词法分析的过程
附录
代码:
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.awt.event.*;
import java.io.*;
public class Compiler extends Frame implements ActionListener{
int row = 1;
int line = 1;
int row = 1;
int line = 1;
MenuBar mb = new MenuBar();
Menu fileMenu = new Menu("File");
Menu actionMenu = new Menu("Project");
MenuItem closeWindow = new MenuItem("Exit");
MenuItem openFile = new MenuItem("Open file");
MenuItem lexical_check = new MenuItem("Check lex");
Menu fileMenu = new Menu("File");
Menu actionMenu = new Menu("Project");
MenuItem closeWindow = new MenuItem("Exit");
MenuItem openFile = new MenuItem("Open file");
MenuItem lexical_check = new MenuItem("Check lex");
int begin = 0;
int end = 0;
TextArea text = new TextArea(25,60);
TextArea error_text = new TextArea(10,60);
FileDialog file_dialog_load = new FileDialog(this, "Open file...", FileDialog.LOAD);
int end = 0;
TextArea text = new TextArea(25,60);
TextArea error_text = new TextArea(10,60);
FileDialog file_dialog_load = new FileDialog(this, "Open file...", FileDialog.LOAD);
Compiler(){
this.setLayout(new FlowLayout());
this.setLayout(new FlowLayout());
this.setMenuBar(mb);
mb.add(fileMenu);
mb.add(actionMenu);
fileMenu.add(openFile);
fileMenu.add(closeWindow);
fileMenu.add(closeWindow);
actionMenu.add(lexical_check);
this.add(text);
this.add(error_text);
error_text.setText("Lexical Information: /n");
this.add(error_text);
error_text.setText("Lexical Information: /n");
closeWindow.addActionListener(this);
openFile.addActionListener(this);
lexical_check.addActionListener(this);
this.setSize(500, 600);
openFile.addActionListener(this);
lexical_check.addActionListener(this);
this.setSize(500, 600);
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
this.setVisible(true);
}
public 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){
System.exit(0);