📄 lexer.java
字号:
tk = new Token (INT, charBuffer, tokenColumn, tokenLine);
}
//如果后一位是.
else if (LA(1) == '.')
{
charBuffer += nextChar();
//如果后一位是终结符
if (isEndChar(LA(1)))
{
tk = new Token (INVALIDNUM, charBuffer, tokenColumn, tokenLine);
}
//如果后一位是数字
else if (Character.isDigit(LA(1)))
{
charBuffer += nextChar();
boolean key = true;
boolean keepNum = true;
//持续读取字符,直到结束符为止
while(key)
{
//如果下一个字符是结束符
if (isEndChar(LA(1)))
{
//如果是合法数字串
if (keepNum)
{
tk = new Token (REAL, charBuffer, tokenColumn, tokenLine);
key = false;
}
//出现其他字符
else
{
tk = new Token (INVALIDNUM, charBuffer, tokenColumn, tokenLine);
key = false;
}
}
//如果下个字符是数字
else if (Character.isDigit(LA(1)))
{
charBuffer += nextChar();
}
//如果下个字符是其他字符
else
{
charBuffer += nextChar();
keepNum = false;
}
}
}
//如果后一位是其他
else
{
charBuffer += nextChar();
boolean key = true;
//持续读取其他符号,直至遇到终结符停止,输出字符串
while(key){
if (isEndChar(LA(1)))
{
tk = new Token (INVALIDNUM, charBuffer, tokenColumn, tokenLine);
key = false;
}
else
{
charBuffer += nextChar();
}
}
}
}
//如果后一位是数字
else if (Character.isDigit(LA(1)))
{
charBuffer += nextChar();
boolean keyIsDigit = true;
//持续读入数字字符
while (keyIsDigit)
{
if (Character.isDigit(LA(1)))
{
charBuffer += nextChar();
}
else
{
keyIsDigit = false;
}
}
//如果下一个字符是终结符
if (isEndChar(LA(1)))
{
tk = new Token (INT, charBuffer, tokenColumn, tokenLine);
}
//如果下一个字符是.
else if (LA(1)== '.')
{
charBuffer += nextChar();
//如果下一个字符为终结符
if (isEndChar(LA(1)))
{
tk = new Token (INVALIDNUM, charBuffer, tokenColumn, tokenLine);
}
else if (Character.isDigit(LA(1)))
{
charBuffer += nextChar();
boolean key = true;
boolean keepNum = true;
while(key)
{
if (isEndChar(LA(1)))
{
if (keepNum)
{
tk = new Token (REAL, charBuffer, tokenColumn, tokenLine);
key = false;
}
else
{
tk = new Token (INVALIDNUM, charBuffer, tokenColumn, tokenLine);
key = false;
}
}
else if (Character.isDigit(LA(1)))
{
charBuffer += nextChar();
}
else
{
keepNum = false;
charBuffer += nextChar();
}
}
}
else
{
charBuffer += nextChar();
boolean key = true;
//持续读取其他符号,直至遇到终结符停止,输出字符串
while(key){
if (isEndChar(LA(1)))
{
tk = new Token (INVALIDNUM, charBuffer, tokenColumn, tokenLine);
key = false;
}
else
{
charBuffer += nextChar();
}
}
}
}
//如果下一个字符其他字符
else {
charBuffer += nextChar();
boolean key = true;
//持续读取其他符号,直至遇到终结符停止,输出字符串
while(key){
if (isEndChar(LA(1)))
{
tk = new Token (INVALIDNUM, charBuffer, tokenColumn, tokenLine);
key = false;
}
else
{
charBuffer += nextChar();
}
}
}
}
//如果后一位是其他
else
{
charBuffer += nextChar();
boolean key = true;
//持续读取其他符号,直至遇到终结符停止,输出字符串
while(key){
if (isEndChar(LA(1)))
{
tk = new Token (INVALIDNUM, charBuffer, tokenColumn, tokenLine);
key = false;
}
else
{
charBuffer += nextChar();
}
}
}
break;
}
return tk;
}
/**
* 判断是否是标识符或是关键字
* @param startPlace
* @param charCh
* @return
*/
public Token isIdentifier(int startPlace,char curCh) {
Token tk = null;
String charBuffer = Character.toString(curCh);
//下一个字符是终结符
if(isEndChar(LA(1)))
{
tk = new Token(ID,charBuffer,tokenColumn,tokenLine);
}
//下一个字符是数字,字母或下划线
else if(Character.isDigit(LA(1)) || ('a' <= LA(1) && 'z' >= LA(1)) || ('A' <= LA(1) && 'Z' >= LA(1))
|| LA(1) == '_')
{
charBuffer += nextChar();
boolean isID = true;
boolean key = true;
//持续读取下一个字符直到终结符
while(key)
{
//下一字符依然是数字,字母,下划线
if(Character.isDigit(LA(1)) || ('a' <= LA(1) && 'z' >= LA(1)) || ('A' <= LA(1) && 'Z' >= LA(1))
|| LA(1) == '_')
{
charBuffer += nextChar();
}
//下一个字符是终结符
else if(isEndChar(LA(1)))
{
if(isID)
{
if(LA(0) == '_')
{
tk = new Token(INVALIDID,charBuffer,tokenColumn,tokenLine);
key = false;
}
else
{
//判断是否是关键字
if(charBuffer.equals("char"))
{
tk = new Token(CHAR,charBuffer,tokenColumn,tokenLine);
}
else if(charBuffer.equals("string"))
{
tk = new Token(STRING,charBuffer,tokenColumn,tokenLine);
}
else if(charBuffer.equals("bool"))
{
tk = new Token(BOOL,charBuffer,tokenColumn,tokenLine);
}
else if(charBuffer.equals("int"))
{
tk = new Token(INT,charBuffer,tokenColumn,tokenLine);
}
else if(charBuffer.equals("real"))
{
tk = new Token(REAL,charBuffer,tokenColumn,tokenLine);
}
else if(charBuffer.equals("if"))
{
tk = new Token(IF,charBuffer,tokenColumn,tokenLine);
}
else if(charBuffer.equals("else"))
{
tk = new Token(ELSE,charBuffer,tokenColumn,tokenLine);
}
else if(charBuffer.equals("while"))
{
tk = new Token(WHILE,charBuffer,tokenColumn,tokenLine);
}
else if(charBuffer.equals("break"))
{
tk = new Token(BREAK,charBuffer,tokenColumn,tokenLine);
}
else if(charBuffer.equals("continue"))
{
tk = new Token(CONTINUE,charBuffer,tokenColumn,tokenLine);
}
else if(charBuffer.equals("return"))
{
tk = new Token(RETURN,charBuffer,tokenColumn,tokenLine);
}
else if(charBuffer.equals("write"))
{
tk = new Token(WRITE,charBuffer,tokenColumn,tokenLine);
}
else if(charBuffer.equals("read"))
{
tk = new Token(READ,charBuffer,tokenColumn,tokenLine);
}
else if(charBuffer.equals("writeln"))
{
tk = new Token(WRITELN,charBuffer,tokenColumn,tokenLine);
}
else if(charBuffer.equals("void"))
{
tk = new Token(VOID,charBuffer,tokenColumn,tokenLine);
}
//为标识符
else
{
tk = new Token(ID,charBuffer,tokenColumn,tokenLine);
}
key = false;
}
}
else
{
tk = new Token(INVALIDID,charBuffer,tokenColumn,tokenLine);
key = false;
}
}
//下一个字符是其他符号
else
{
charBuffer += nextChar();
isID = false;
}
}
}
//下一个字符是其他字符
else
{
charBuffer += nextChar();
boolean key = true;
//持续读取其他符号,直至遇到终结符停止,输出字符串
while(key){
if (isEndChar(LA(1)))
{
tk = new Token (INVALIDNUM, charBuffer, tokenColumn, tokenLine);
key = false;
}
else
{
charBuffer += nextChar();
}
}
}
return tk;
}
/**
* 判断是否是非法字符串
* @param startPlace
* @param charCh
* @return
*/
public Token isSpecialSymbol(int startPlace,char curCh) {
Token tk = null;
String charBuffer = Character.toString(curCh);
boolean key = true;
//持续读取其他符号,直至遇到终结符停止,输出字符串
while(key){
if (isEndChar(LA(1)))
{
tk = new Token (INVALIDID, charBuffer, tokenColumn, tokenLine);
key = false;
}
else
{
charBuffer += nextChar();
}
}
return tk;
}
/**
* 判断当前字符是否为终结符
* @param ch
* @return
*/
public boolean isEndChar(char ch){
if (ch == ',' || ch == ';' || ch == '\'' || ch == '"' || ch == '('
|| ch == ')' || ch == '[' || ch == ']' || ch == '{' || ch == '}'
|| ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '='
|| ch == '!' || ch == '>' || ch == '<' || ch == '&' || ch == '|'
|| ch == '#' || ch == ' ' || ch == '\r' || ch == '\n' || ch == '\t'
|| ch == 'ん')
{
return true;
}
else
{
return false;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -