📄 lexer.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 + -