⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lex.java

📁 这是一个实现词法分析的小程序
💻 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 + -