📄 lex.java
字号:
//package mine;
import java.io.*;
import java.awt.*;
import javax.swing.*;
import java.util.regex.*;
import java.lang.Character.*;
class ParserException extends Exception
{
public ParserException(String message)
{
super(message);
}
}
class Token //标记类
{
public final static int INVALID = -1; //出错标志
public final static int KEYWORD = 1; //关键字
public final static int OPERATOR = 4; //运算符
public final static int NUM = 3; //数字
public final static int SIGNWORD = 2; //标志符
public final static int BOUND_SYMBOL = 5; //界符
public final static String[] KEY_WORD={"double","int","struct","break","else","long","switch","case","enum","register","typedef","char","return","const","float","short","continue","for","signed","void","default","goto","do","if","while","static","then"};//关键字表
private String content;
private int type;
public Token(String content, int type)
{
this.content = content;
this.type = type;
}
public String getContent()
{
return content;
}
public double getDoubleValue() //将content内容转换为双精度数据
{
return Double.parseDouble(content);
}
public int getType()
{
return type;
}
}
public class Lex //词法类
{
private String buffer; //缓冲器
private int colNum = 0; //指向缓冲器字符的指针
private char curChar; //记录当前字符
public Lex(String input) //需要分析的字符串为参数
{
this.buffer = input;
curChar = getChar();
}
private char getChar() //得到当前字符函数
{
char ch = '#';
while(buffer!=null && colNum<buffer.length()) //若缓冲器中的字符串不为空且未字符串分析完
{
ch = buffer.charAt(colNum); //等到当前字符
colNum++; //指针指向下一个字符
break;
}
return ch;
}
private void skipBlank() //过滤空格
{
while(curChar == ' ')
curChar = getChar();
}
public Token getToken() throws ParserException //将单词归类
{
Token tk = null;
if(curChar == ' ')
skipBlank();
if(Character.isLetter(curChar))
curChar='$';
switch(curChar)
{
case '(':
tk = new Token("(",Token.BOUND_SYMBOL);
curChar = getChar();
break;
case ')':
tk = new Token(")",Token.BOUND_SYMBOL);
curChar = getChar();
break;
case '+':
tk = new Token("+",Token.OPERATOR);
curChar = getChar();
break;
case '-':
tk = new Token("-",Token.OPERATOR);
curChar = getChar();
break;
case '*':
tk = new Token("*",Token.OPERATOR);
curChar = getChar();
break;
case '/':
tk = new Token("/",Token.OPERATOR);
curChar = getChar();
break;
case '>':
tk = new Token(">",Token.OPERATOR);
curChar = getChar();
break;
case '<':
tk = new Token("<",Token.OPERATOR);
curChar = getChar();
break;
case '=':
tk = new Token("=",Token.OPERATOR);
curChar = getChar();
break;
case ';':
tk = new Token(";",Token.BOUND_SYMBOL);
curChar = getChar();
break;
case ',':
tk = new Token(",",Token.BOUND_SYMBOL);
curChar = getChar();
break;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case '.':
tk = parseNumber(); //数字类型
break;
case '#': //#为结束标志
tk = null;
break;
case '$':
String s="";
colNum--;
curChar=getChar();
while(Character.isLetter(curChar))
{
s+=curChar;
curChar = getChar();
}
if(isKeyWord(s))
{
tk = new Token(s,Token.KEYWORD);
break;
}
else
{
if(curChar==' '||curChar==')'||curChar=='='||curChar==','||curChar==';'||curChar=='>'||curChar=='<'||curChar=='+'||curChar=='-'||curChar=='*'||curChar=='/') //规定标志符后要跟空格/右括号/等号等
{
tk=new Token(s,Token.SIGNWORD);
break;
}
else
tk = new Token(s,Token.INVALID);
break;
}
default:
tk = new Token("Invalid character",Token.INVALID);
curChar = getChar();
break;
}
return tk;
}
private boolean isKeyWord(String s) //是否是关键字
{
boolean b=false;
for(int i=0;i<Token.KEY_WORD.length;i++)
if(s.equals(Token.KEY_WORD[i]))
b=true;
return b;
}
private Token parseNumber() throws ParserException
{
int dotNum = 0; //小数
boolean key = true;
StringBuffer buf = new StringBuffer();
buf.append(curChar);
if(curChar == '.') dotNum++;
while(key)
{
curChar = getChar();
switch(curChar)
{
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
buf.append(curChar); //数字拼接
continue;
case '.': //有小数点
dotNum++;
if(dotNum > 1)
throw new ParserException("the string inputed error at column:" + colNum);
buf.append('.');
continue;
default:
key = false;
continue;
}
}
return new Token(buf.toString(),Token.NUM);
}
public static void main(String args[]) {
try {
String getFromFile=""; //读文件
File configFile=new File("file.txt");
FileReader myFileReader=null;
myFileReader=new FileReader(configFile);
BufferedReader bufReader=new BufferedReader(myFileReader);
String buf="";
while((buf=bufReader.readLine())!=null)
getFromFile+=buf;
System.out.println(getFromFile);
Lex lex = new Lex(getFromFile);
buf=getFromFile+"\r\n"+"\r\n词法分析结果:"+"\r\n"+"\r\n";
while(true) {
Token tk = lex.getToken();
if(tk == null) {
break;
}
else
buf+="("+tk.getContent()+","+tk.getType()+")"+"\r\n";
}
System.out.println("词法分析结果显示在result.txt文件中......");
File f=new File("rusult.txt"); //将结果写入文件中
BufferedWriter output = new BufferedWriter(new FileWriter(f));
output.write(buf);
output.close();
}
catch(Exception e) {
e.printStackTrace();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -