📄 lexer.java
字号:
tk = new Token(REMARK,charBuffer,tokenColumn,tokenLine);
break;
}
else{
if (LA(0) == '*' && LA(1) == '/')
{
charBuffer += nextChar();
tk = new Token(REMARK,charBuffer,tokenColumn,tokenLine);
break;
}
else{
charBuffer += nextChar();
}
}
}//for
}//if
else
{
tk = new Token(REMARK,charBuffer,tokenColumn,tokenLine);
}
}//if
//如果是单行注释符
else if(LA(1) == '/')
{
charBuffer += nextChar();
boolean notNewLineKey = true;
//向后读取一直到遇到换行符号
while(notNewLineKey)
{
if(LA(1) == '\r')
{
tk = new Token(REMARK,charBuffer,tokenColumn,tokenLine);
notNewLineKey = false;
}
else
{
charBuffer += nextChar();
}
}//while
}
//不是注释标识符
else
{
tk = new Token(DIV,Character.toString(curCh),tokenColumn,tokenLine);
}
}
else
{
tk = new Token(DIV,Character.toString(curCh),tokenColumn,tokenLine);
}
break;
case '=':
if(LA(1) == '=')
{
charBuffer += nextChar();
tk = new Token(EQUA,Character.toString(curCh),tokenColumn,tokenLine);
}
else
{
tk = new Token(EVAL,Character.toString(curCh),tokenColumn,tokenLine);
}
break;
case '>':
if(LA(1) == '=')
{
charBuffer += nextChar();
tk = new Token(EGRTR,Character.toString(curCh),tokenColumn,tokenLine);
}
else
{
tk = new Token(GRTR,Character.toString(curCh),tokenColumn,tokenLine);
}
break;
case '<':
if(LA(1) == '=')
{
charBuffer += nextChar();
tk = new Token(ELESS,Character.toString(curCh),tokenColumn,tokenLine);
}
else
{
tk = new Token(LESS,Character.toString(curCh),tokenColumn,tokenLine);
}
break;
case '!':
if(LA(1) == '=')
{
charBuffer += nextChar();
tk = new Token(NEQUA,Character.toString(curCh),tokenColumn,tokenLine);
}
else
{
tk = new Token(NOT,Character.toString(curCh),tokenColumn,tokenLine);
}
break;
}
return tk;
}
/**
* 判断是否是加减号还是正负数
* @param startPlace
* @param curCh
*/
public Token isAddOrMinus(int startPlace, char curCh) {
Token tk = null;
String charBuffer = Character.toString(curCh);
switch (curCh) {
case '+':
//如果加号不是第一位
if (startPlace != 0 )
{
boolean key = true;
//向前遍历判断是加号还是正号
while(key) {
int i = -1;
//如果是正号
if (LA(i) == '(' || LA(i) == '&' || LA(i) == '|'
|| LA(i) == '=' || LA(i) == '>' || LA(i) == '<')
{
//正号的后一位是数字
if (Character.isDigit(LA(1)))
{
char firstNum = nextChar();
Token numberBuffer = isNumber(CharQueue.head - 1, firstNum);
charBuffer += numberBuffer.getTxt();
//后面的数字串是整数
if(numberBuffer.getType() == 31)
{
tk = new Token(VINT, charBuffer,tokenColumn, tokenLine);
key = false;
}
//后面的数字串是实数
else if(numberBuffer.getType() == 32)
{
tk = new Token(VREAL, charBuffer,tokenColumn, tokenLine);
key = false;
}
//后面的数字串是非法数字串
else
{
tk = new Token(INVALIDNUM, charBuffer,tokenColumn, tokenLine);
key = false;
}
}
//后面一位是终结符
else if(isEndChar(LA(1)))
{
tk = new Token (ADD, charBuffer, tokenColumn, tokenLine);
key = false;
}
//后面一位是其他符号
else
{
charBuffer += nextChar();
boolean keyNotEnd = true;
//持续向后读取直到终结符号
while(keyNotEnd) {
if (isEndChar(LA(1)))
{
tk = new Token (INVALIDNUM, charBuffer, tokenColumn, tokenLine);
keyNotEnd = false;
key = false;
}
else
{
charBuffer += nextChar();
}
}
}
}
//前一位是空格或制表符号,继续向前遍历
else if(LA(i) == ' ' || LA(i) == '\t')
{
i--;
}
//前一位不是空格制表符号,也不是( & | = > <
else
{
tk = new Token (ADD, charBuffer, tokenColumn, tokenLine);
key = false;
}
}
}
//如果加号是第一位
else
{
tk = new Token (ADD, charBuffer, tokenColumn, tokenLine);
}
break;
case '-':
// 如果减号不是第一位
if (startPlace != 0 )
{
boolean key = true;
//向前遍历判断是减号还是负号
while(key) {
int i = -1;
//如果是负号
if (LA(i) == '(' || LA(i) == '&' || LA(i) == '|'
|| LA(i) == '=' || LA(i) == '>' || LA(i) == '<')
{
//负号的后一位是数字
if (Character.isDigit(LA(1)))
{
char firstNum = nextChar();
Token numberBuffer = isNumber(CharQueue.head - 1, firstNum);
charBuffer += numberBuffer.getTxt();
//后面的数字串是整数
if(numberBuffer.getType() == 31)
{
tk = new Token(VINT, charBuffer,tokenColumn, tokenLine);
key = false;
}
//后面的数字串是实数
else if(numberBuffer.getType() == 32)
{
tk = new Token(VREAL, charBuffer,tokenColumn, tokenLine);
key = false;
}
//后面的数字串是非法数字串
else
{
tk = new Token(INVALIDNUM, charBuffer,tokenColumn, tokenLine);
key = false;
}
}
//后面一位是终结符
else if(isEndChar(LA(1)))
{
tk = new Token (MIN, charBuffer, tokenColumn, tokenLine);
key = false;
}
//后面一位是其他符号
else
{
charBuffer += nextChar();
boolean keyNotEnd = true;
//持续向后读取直到终结符号
while(keyNotEnd) {
if (isEndChar(LA(1)))
{
tk = new Token (INVALIDNUM, charBuffer, tokenColumn, tokenLine);
keyNotEnd = false;
key = false;
}
else
{
charBuffer += nextChar();
}
}
}
}
//前一位是空格或制表符号,继续向前遍历
else if(LA(i) == ' ' || LA(i) == '\t')
{
i--;
}
//前一位不是空格制表符号,也不是( & | = > <
else
{
tk = new Token (MIN, charBuffer, tokenColumn, tokenLine);
key = false;
}
}
}
//如果减号是第一位
else
{
tk = new Token (MIN, charBuffer, tokenColumn, tokenLine);
}
break;
}
return tk;
}
/**
* 判断是否为数字
* @param startPlace
* @param curCh
* @return
*/
public Token isNumber(int startPlace, char curCh) {
Token tk = null;
String charBuffer = Character.toString(curCh);
switch(curCh){
case '0':
//后一位字符为终结符
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();
}
}
}
break;
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
//如果后一位是终结符
if (isEndChar(LA(1)))
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -