📄 byylscanner.java
字号:
package byyl;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
/**
*题目:符号表中的名字类<br>
*描述:作为符号表中的NAME类,它有两个属性,分别存放标志符在字符串的起始地址和长度
*@author 闫相通(040410206) 哈工大(威海) xiangtongcz@126.com
*@version 2007.3.13
*/
class WordName
{
/**
*存放标志符在字符串中的起始地址
*/
public int start;
/**
*存放标志符的长度
*/
public int length;
}
//
/**
*题目:符号表类<br>
*描述:存放符号表
*@author 闫相通 (040410206) 哈工大(威海) xiangtongcz@126.com
*@version 2007.3.13
*/
class Symbol
{
/**
*符号表的每一项的序号
*/
public int addr;
/**
*存放标识符,用于输出显示
*/
public StringBuffer sign;
/**
*符号表的名字栏,对数字来说,它的两个属性都是0
*/
public WordName name;
/**
*标志符的类型
*/
public StringBuffer type;
/**
*标志符的种类
*/
public StringBuffer kind;
/**
*标志符的值
*/
public StringBuffer val;
/**
*构造函数,将各个属性生成对象
*/
public Symbol()
{
sign=new StringBuffer();
name=new WordName();
type=new StringBuffer();
kind=new StringBuffer();
val=new StringBuffer();
}
}
/**
*题目:token类<br>
*描述:存放种别码,属性值及其对应的字符串
*@author 闫相通(040410206) 哈工大(威海) xiangtongcz@126.com
*@version 2007.3.13
*/
class Token
{
/**
*token的序号
*/
public int label;
/**
*存放标志符或数字
*/
public StringBuffer name;
/**
*种别码
*/
public int code;
/**
*在符号表的入口地址
*/
public int address;
/**
*构造函数,将name指向一个StringBuffer类对象
*/
public Token()
{
name=new StringBuffer();
}
}
/**
*题目:存放算术表达式或布尔表达式的堆栈类<br>
*描述:按顺序存放布尔表达式或算术表达式的每一个字符
*@author 闫相通(040410206) 哈工大(威海) xiangtongcz@126.com
*@version 2007.3.13
*/
class stack
{
/**
*表达式的每一个字符
*/
public StringBuffer name;
/**
*每一个字符的编码
*/
public int cod;
/**
*每一个字符的入口地址
*/
public int addr;
/**
*构造函数,将name指向一个StringBuffer类对象
*/
public stack()
{
name=new StringBuffer();
}
}
/**
*题目:存放生成的四元式的堆栈类<br>
*描述:存放四元式的栈
*@author 闫相通(040410206) 哈工大(威海) xiangtongcz@126.com
*@version 2007.3.13
*/
class equ
{
/**
*操作码
*/
public StringBuffer op;
/**
*第一个操作数在符号表中地址
*/
public int op1;
/**
*第二个操作数在符号表中地址
*/
public int op2;
/**
*运算的结果
*/
public int result;
/**
*构造函数,将op指向一个StringBuffer类对象
*/
equ()
{
op=new StringBuffer();
}
}
/**
*题目:ByylScanner启动运行类<br>
*描述:Simple语言编译器。包括词法分析,语法/语义分析.<br>
* 中间生成的有符号表,token串,修改后的符号表和四元式。<br>
* 运行时您将见到四个显示区域。用途如下<br>
* 左上 inputTextArea 用于打开和编写simple语言源程序<br>
* 右上symbolTableTextArea 用于显示词法分析后的符号表和修改后的符号表<br>
* 左下resultTextArea 用于显示词法分析和语法语义分析的出错情况<br>
* 右下tokenTextArea 用于显示token串和生成的四元式
*@author 闫相通(040410206) 哈工大(威海) xiangtongcz@126.com
*@version 2007.3.13
*/
public class ByylScanner {
/**
*显示的窗体
*/
private Frame frame;
/**
*窗体上的菜单
*/
private MenuBar menubar;
/**
*菜单中的"文件"项
*/
private Menu menuFile;
/**
*菜单中的"编译"项
*/
private Menu menuBuild;
/**
*菜单中的"保存"项
*/
private Menu menuSave;
/**
*"文件"中的"打开"
*/
private MenuItem menuFileOpen;
/**
*"文件"中的"关闭"
*/
private MenuItem menuFileClose;
/**
*"文件"中的"推出"
*/
private MenuItem menuFileExit;
/**
*"编译"中的"词法分析"
*/
private MenuItem menuBuildMorphemeAnalysis;
/**
*"编译"中的"语法/语义分析"
*/
private MenuItem menuBuildParsing;
/**
*"保存"中的"保存原文件"
*/
private MenuItem menuSaveSource;
/**
*"保存"中的"保存符号表"
*/
private MenuItem menuSaveSymbol;
/**
*"保存"中的"保存token串"
*/
private MenuItem menuSaveToken;
/**
*"保存"中的"保存四元式"
*/
private MenuItem menuSaveCode;
/**
*显示程序的输入区
*/
private TextArea inputTextArea;
/**
*输出符号表和字符串的区域
*/
private TextArea symbolTableTextArea;
/**
*显示此法分析和语法/语义分析的结果
*/
private TextArea resultTextArea;
/**
*词法分析时显示token串<br>
*语法/语义分析时显示四元式
*/
private TextArea tokenTextArea;
/**
*指向当前所处理的文件的指针
*/
private File currentFile=new File("");
/**
*fileFlag=0表示可以直接关闭程序<br>
*fileFlag=1表示原文件已经被修改,但未保存,点击保存则直接保存,
*点击打开则直接保存后再打开,点击关闭则保存后再关闭<br>
*fileFlag=2表示新建的文件,要弹出对话框给出文件名。
*/
private int fileFlag=0;
/**
*打开文件时弹出对话框以选择文件
*/
private FileDialog fileChooser ;
/**
*打开文件时弹出对话框以选择文件
*/
private FileDialog fileSaver ;
/**
*将文件内容显示在输入区时所用的输入流
*/
private FileInputStream fis;
/**
*将输入区内容保存到文件时所用的输出流
*/
private FileOutputStream fos;
/**
*当前token串
*/
private Token currentToken;
/**
*当前符号表
*/
private Symbol currentSymbol;
/**
*存放当前分析的程序的所有字符
*/
private String saveText;
/**
*字母表
*/
private StringBuffer alphabet;
/**
*读入文件的长度
*/
private int len;
/**
*读入的文件内容存在byte串中
*/
private byte []buffer;
/*
*符号表的每一行存放在数组里面
*/
private Symbol []symbolList;
/**
*token串存放在数组里面
*/
private Token []tokenList;
/**
*当前字符在saveText符号串中的位置
*/
private int charId;
/**
*读入的字符
*/
private char ch;
/**
*字符串个数统计
*/
private int varCount;
/**
*token计数器
*/
private int tokenCount;
/**
*说明语句结束的标志位
*/
private int varEnd;
/**
*词法分析时错误计数器
*/
private int errorCount;
/**
*token的计数器
*/
private int labelCount;
/**
*符号表的计数器
*/
private int addrCount;
/**
*行计数器
*/
private int rowCount;
/**
*列计数器
*/
private int columnCount;
/**
*用于程序是否正常结束,碰到begin,beginCode加2
*/
private int beginCode;
/**
*碰到end后,endCode加一,碰到;或.再加一
*/
private int endCode;
/**
*设定符号表的最大长度
*/
private static final int MAX=500;
/**
*保留字的个数
*/
private static final int LENGTH=33;
/**
*存放关键字的数组
*/
private StringBuffer []keyWord;
//以下用于语法/语义分析
/**
*堆栈expr[]的大小
*/
private static final int EXP_LEN=100;
/**
*堆栈Equ[]的大小
*/
private static final int EQU_LEN=1024;
/**
*随即地址的下界
*/
private static final int TEMPBOUNDARY=5000;
/**
*从tokenList[]取出token的计数器
*/
private int tokenId;
/**
*当前token的种别码
*/
private int code;
/**
*当前token在符号表中的入口地址(序号)
*/
private int address;
/**
*语法/语义分析时的行计数器
*/
private int lineOfPro;
/**
*下一个将要生成的四元式的序号
*/
private int lineOfEqu;
/**
*存放运算表达式和布尔表达式
*/
private stack []expr;
/**
*存放四元式的数组
*/
private equ []Equ;
/**
*存放当前token对应的字符串或数字
*/
private StringBuffer ID;
/**
*expr[]堆栈的计数器
*/
private int pos;
/**
*当前分析的token在堆栈expr[]的位置
*/
private int nowAddr;
/**
*随即变量地址
*/
private int tempCount;
/**
*语法/语义分析时错误计数器
*/
private int error_count;
/**
*存放真出口地址数组
*/
private int []trueAddress;
/**
*存放假出口地址
*/
private int []falseAddress;
/**
*假出口地址数组中即将生成的下一个出口的序号
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -