今天老师要我们写一个简单的词法分析程序,实现简单的词法分析。经过我一个下午的努力,下面的简单词法分析就出来了。(本人实力有限,目前只能做到这样了。梁)
import java.io.FileReader;
public class Compile {
private static String[] key = {"begin", "end", "if", "then", "else", "while", "do"};//待识别的关键字数组
private static String[] border = {",", ";", "{", "}", "(", ")"};//待识别的特殊字符数组
private static String[] arithmetic = {"+", "-", "*", "/"};//待识别的算数运算数组
private static String[] relation = {"<", ">", "<=", "=", ">=", "<>"};//待识别的逻辑运算数组
private static String[] constNumber = new String[20];//用于存储用户自己定义的常数
private static String[] label = new String[20];//用于存储用户自己定义的单词
private static int constNum = 0;//动态记录用户定义的整形数个数
private static int labelNum = 0;//动态记录用户定义的单词个数
private static FileReader fileReader = null;//全局字符流
public static void main(String[] args) throws Exception {
String fileName = "D:\Project\JavaDemo\text";//要识别的程序的地址
fileReader = new FileReader(fileName);//获得文件字符流
int number = fileReader.read();//用来存放从文件中读到的字符的ASCII码,主要利于后面的文件尾部的判断
while (number != -1) {
char c = (char) number;//用来存放从文件中读到的字符
if (Character.isLetter(c))//当读到的第一个字符是字母,调用alphaProcess方法
number = alphaProcess(c);
else if (Character.isDigit(c))//当读到的第一个字符是数字时,调用digitProcess方法
number = digitProcess(c);
else number = otherProcess(c);//当读到的第一个字符是其他类型时,调用otherProcess方法
}
}
private static int search(String searchChar, int wordType) {
int i;//字符串在字符串数组中的位置
switch (wordType) {
case 1://识别关键字
{
for (i = 0; i < 7; i++) {
if ((key[i].equals(searchChar)))
return (i + 1);
}
return 0;
}
case 2: //识别特殊字符
{
for (i = 0; i < 6; i++) {
if (border[i].equals(searchChar))
return (i + 10);
}
return 0;
}
case 3://识别算数运算符
{
for (i = 0; i < 3; i++) {
if (arithmetic[i].equals(searchChar)) {
return (i + 16);
}
}
return 0;
}
case 4://识别逻辑运算符
{
for (i = 0; i < 5; i++) {
if (relation[i].equals(searchChar)) {
return (i + 20);
}
}
return 0;
}
case 5://识别数字,有则识别,没有则添加
{
for (i = 0; i < constNum; i++) {
if (constNumber[i].equals(searchChar)) {
return (i + 1);
}
}
constNumber[i] = searchChar;//存放用户新定义的数字
constNum++;
return i;
}
case 6: //识别自定义字符串,有择识别,没有则添加
{
for (i = 0; i < labelNum; i++) {
if (label[i].equals(searchChar)) {
return (i + 1);
}
}
label[i] = searchChar;//存放用户新定义的单词
labelNum++;
return i;
}
default:
return 0;
}
}
private static int alphaProcess(char buffer) throws Exception {
int aType;//这个字符串的种别码
int number = 0;//字符的ASCII码值
int i = -1;//指针,指向字符应放的位置
char[] alphaTp = new char[20];//存放读到的这个字符串
while (Character.isLetter(buffer) || Character.isDigit(buffer)) {
alphaTp[++i] = buffer;
number = fileReader.read();
buffer = (char) number;
}
alphaTp[i + 1] = ' ';//字符串的结束标志
//1、用来识别关键字
String searchChar = new String(alphaTp).toLowerCase().trim();
if ((aType = search(searchChar, 1)) != 0) {
System.out.println(String.format("(%d,%s)", aType, searchChar));
}
//2、用来识别自定义字符串
else {
aType = search(searchChar, 6);
System.out.println(String.format("(9,%d,%s)", aType, searchChar));
}
return number;
}
private static int digitProcess(char buffer) throws Exception {
int i = -1;//指针,用于定位存放字符的位置
int number = 0;//字符的ASCII码值
char[] digitTp = new char[20];//用来存放读到的数字
while (Character.isDigit(buffer)) {
digitTp[++i] = buffer;
number = fileReader.read();
buffer = (char) number;
}
digitTp[i + 1] = ' ';//字符串结束标志
//调用查询方法 ,查询这个数字在数组中的位置
String searchChar = new String(digitTp).toLowerCase().trim();
int digitType = search(searchChar, 5);
System.out.println(String.format("(8,%d,%s)", digitType, searchChar));
return number;
}
private static int otherProcess(char buffer) throws Exception {
char[] otherTp = new char[20];//用来存放读到的字符串
int number = 0;//字符的ASCII码值
int oType, oTypeTp;
otherTp[0] = buffer;
otherTp[1] = ' ';
String searchChar = new String(otherTp).toLowerCase().trim();
if ((oType = search(searchChar, 3)) != 0) {
System.out.println(String.format("(%d,%s)", oType, searchChar));
number = fileReader.read();
return number;
}
if ((oType = search(searchChar, 4)) != 0) {
number = fileReader.read();
buffer = (char) number;
otherTp[1] = buffer;
otherTp[2] = ' ';
if ((oTypeTp = search(searchChar, 4)) != 0) {
System.out.println(String.format("(%d,%s)", oTypeTp, searchChar));
return number;
} else {
otherTp[1] = ' ';
System.out.println(String.format("(%d,%s)", oType, searchChar));
return number;
}
}
if ((oType = search(searchChar, 2)) != 0) {
System.out.println(String.format("(%d,%s)", oType, searchChar));
number = fileReader.read();
return number;
}
if ((buffer != 'n') && (buffer != ' ')) {
number = fileReader.read();
}
return number;
}
}
输入:
输出:



