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

📄 lexer.java

📁 PEPA模型性能分析工具
💻 JAVA
字号:
package trans;

import semantic.ParserException;
import semantic.Scanner;
import semantic.Symbol;
import semantic.Token;

public class Lexer implements Scanner{
	private String content;
	private int start=0;
	private int current=0;
	private int end=0;
	private static int line=0;
	private static int column=0;
	
	public Lexer(String s)
	{
		content=s;
		content+="\0";
		end=content.length();
	}
	public boolean hasnext()
	{
		return(current<end);
	}
	
	public char next()
	{
		column++;
		return content.charAt(current++);
	}
	public char back()
	{
		column--;
		current--;
		current=current>0?current:0;
		return content.charAt(current);
	}
	public char probe()
	{
		return content.charAt(current);
	}
	public Symbol next_token() throws ParserException 
	{
		// TODO Auto-generated method stub
		boolean rflag=false;
		char cur;//current char
		while(hasnext())
		{	cur=next();
			switch(cur)
			{
			case 0:
				return new Symbol(Token.EOF);
			case '\u000B':
			case '\u000C':
			case '\u0085':
			case '\u2028':
			case '\u2029':
			     line++;
			     column=0;
			     break;
			case '\r':
				 line++;
			     column=0;
			     rflag=true;
			     break;
			case '\n':
				if(rflag)
					rflag=false;
				else{
			     line++;
			     column=0;
				}
			     break;
			case '=':
				return new Symbol(Token.EQUALS);
			case ';':
				return new Symbol(Token.SEMI);
			case ',':
				return new Symbol(Token.COMMA);
			case '(':
				return new Symbol(Token.LPAREN);
			case ')':
				return new Symbol(Token.RPAREN);
			case '.':
				return new Symbol(Token.DOT);
			case '+':
				return new Symbol(Token.SUM);
			case '-':
				return new Symbol(Token.MINUS);
			case '%':
				return new Symbol(Token.PERC);
			case '#':
				return new Symbol(Token.HASH);
			case '*':
				return new Symbol(Token.MULT);
			case '/':
			{
				cur=probe();
				if(cur=='/')
				{
					current=content.indexOf('\n',current);
					break;
				}
				else
				{
					return new Symbol(Token.DIVIDE);
				}
			}
			case '<':
				return new Symbol(Token.LCOOP);
			case '>':
				return new Symbol(Token.RCOOP);
			case '{':
				return new Symbol(Token.LSET);
			case '}':
				return new Symbol(Token.RSET);
			case ' ':
				break;
			default:
				{
					if(isCharacter(cur))
					{
						return (parserString());
					}else if(isNumber(cur))
					{
						return (parserNumber());
					}
					String err="Syntax Error at line:"+line+" near column:"+column+" Current Char:"+cur;
					throw new ParserException(err);
				}
			}
		}
		return new Symbol(Token.EOF);
	}

	private Symbol parserString()
	{
		int lpos=current-1;
		char ch=next();
		while(isCharacter(ch)||isNumber(ch)||isConnect(ch))
		{
			ch=next();
		}
		back();
		int rpos=current;
		String s=content.substring(lpos,rpos);
		if(s.compareTo("infty")==0)
			return new Symbol(Token.TOP);
		else if(s.compareTo("T")==0)
			return new Symbol(Token.TOP);
		else
			return new Symbol(Token.STRN,s);
	}
	private boolean isConnect(char c)
	{
		if(c=='_'||c=='-'||c=='\'')return true;
		return false;
	}
	private Symbol parserNumber() throws ParserException
	{
		int lpos=current-1;
		char ch=next();
		while(isNumber(ch))
		{
			ch=next();
		}
		if(ch=='.')
		{
			ch=next();
			while(isNumber(ch))
			{
				ch=next();
			}
		}
		if(isCharacter(ch))
		{
			String err="--行:"+line+" 列:"+column+" 处字符出错!\n";
			throw new ParserException(err);
		}
		back();
		int rpos=current;
		String s=content.substring(lpos,rpos);
		return new Symbol(Token.NUMB,new Double(s));
	}
	private boolean isCharacter(char c)
	{
		char ch=Character.toLowerCase(c);
		if(ch>='a'&&ch<='z')
			return true;
		else
			return false;
	}
	
	private boolean isNumber(char c)
	{
		if(c>='0'&&c<='9')
			return true;
		else 
			return false;
	}
	public static int getLine()
	{
		return line;
	}
	public static int getColumn()
	{
		return column;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -