Java实现简单的词法分析器:
需求分析
5类符号
保留字(keywords):if、int、for、while、do、return、break、continue等等;单词种别码为1
其他的字符都为标识符(identifier);单词种别码为2
常数为无符号数(unsigned number);单词种别码为3
运算符(operator)包括:+、-、*、/、=、>、
分隔符(separator)包括: “,”“;”“(”“)”“{”“}”等; 单词种别码为5。
分析流程
流程图
代码设计
目录结构
目录结构
symbols目录下的txt文件分别保存关键字信息(keywords.txt)、操作符信息(operators.txt)、分隔符信息(separators.txt)。
Util包中分别为文件读取工具类(FileReadUtil)和词法分析工具类(LexerUtil)
symbols包中为符号类
lexer包中的类和Main结合用来控制界面显示,界面使用JavaFx实现。
符号类设计
类图
所有的符号类都继承自抽象类Token,Token类中带参构造函数用来初始化,读取保存在txt文件中的保留字,标识符,分隔符信息并保存在List中。
KeyWord类、Operator类、Separator类重写这个带参构造函数来读取符号并调用Token的getList()方法将读取的的符号保存到它们的内部的静态List中。
Identifier类、UnsignedNumber类不重写构造函数,即他们只有默认的无参构造函数。
这部分只给出Token、KeyWord和Identifier的代码实现。
完整代码在我的Github: https://github.com/LiuJinxuan/Lexer.git
Token类
package com.company.symbols;
import com.company.utils.FileReadUtil;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Ljx on 2017/5/6.
*/
public abstract class Token {
private static List tokens = new ArrayList<>();
public Token() {
}
public Token(String fileName) {
try {
tokens = FileReadUtil.ReadSymbols(fileName);
} catch (FileNotFoundException e) {
System.out.println(fileName + " NOT FOUND!");
} catch (IOException e) {
e.printStackTrace();
}
}
protected List getTokens() {
return tokens;
}
//返回识别码TAG
public abstract int getTAG();
//返回具体的类型
<