📄 analyser.cs
字号:
cToken.setCmm(LPAREN);
cChar += (char)c;
break;
case ')':
cToken.setCmm(RPAREN);
cChar += (char)c;
break;
case '{':
cToken.setCmm(LBRACE);
cChar += (char)c;
break;
case '}':
cToken.setCmm(RBRACE);
cChar += (char)c;
break;
case ';':
cToken.setCmm(SymbolI);
cChar += (char)c;
break;
case ',':
cToken.setCmm(COMMA);
cChar += (char)c;
break;
case '[':
cToken.setCmm(LMIDPAREN);
cChar += (char)c;
break;
case ']':
cToken.setCmm(RMIDPAREN);
cChar += (char)c;
break;
default:
//处理错误
cToken.setCmm(ERROR);
cChar += "The " + linePos + " Character '" + (char)c + "' is error !";
errorList.addError(new Error("Unexpected charactor: "
+ (char)c, lineNum));
break;
}
}
}
// 查询一个标识符是否为保留字类,如果是则返回类型该保留字的类型,否则返回ID类型
protected int reservedCheck(String reserved)
{
for (int i = 0; i < keyWord.Length; i++)
{
if (keyWord[i].getName().Equals(reserved))
return keyWord[i].getCmmType();
}
return ID;
}
// 处理并识别赋值
protected void processAssignState()
{
unGetNextChar();
int c = getNextChar();
if (c == '=')
{
cChar += (char)c;
cToken.setCmm(ASSIGN);
}
else
{
//处理错误
cToken.setCmm(ERROR);
cChar += "The " + linePos + " Character '" + (char)c + "' is error !";
errorList.addError(new Error("Unexpected charactor: "
+ (char)c, lineNum));
unGetNextChar();
}
}
protected void processCharState()
{
int c = getNextChar();
if (isLetterOrDigit(c))
{
int c1 = getNextChar();
if (c1 == '\'')
{
cToken.setCmm(CHARC);
cChar += (char)c;
cChar += (char)c1;
}
else
{
unGetNextChar();
unGetNextChar();
//处理错误
cToken.setCmm(ERROR);
cChar += "The " + linePos + " Character '" + (char)c + "' is error !";
errorList.addError(new Error("Unexpected charactor: "
+ (char)c, lineNum));
}
}
else
{
unGetNextChar();
//处理错误
cToken.setCmm(ERROR);
cChar += "The " + linePos + " Character '" + (char)c + "' is error !";
errorList.addError(new Error("Unexpected charactor: "
+ (char)c, lineNum));
}
}
// 处理并识别标识符ID单词,只能以字母开头,不能以"_"结尾。
protected void processIDState()
{
int c = getNextChar();
//int var = 0;
while (isLetterOrDigit(c) || c == '_')
{
cChar += (char)c;
c = getNextChar();
}
if (cChar[cChar.Length - 1] == '_')
{
cToken.setCmm(ERROR);
errorList.addError(new Error("Unexpected charactor: "
+ (char)c, lineNum));
cChar = (linePos - 1) + "个字符: '" + cChar + "' 错误!";
unGetNextChar();
}
else
{
unGetNextChar();
cToken.setCmm(ID);
}
}
// 处理并识别数字number串
public void processNumState()
{
unGetNextChar();
int c = getNextChar();
int dotNum = 0;
while (isLetterOrDigit(c) || c == '.')
{
if (isDigit(c))
{
cChar += (char)c;
c = getNextChar();
cToken.setCmm(NUM);
}
else if (isLetter(c))
{
while (isLetterOrDigit(c))
{
cChar += (char)c;
c = getNextChar();
}
cToken.setCmm(ERROR);
errorList.addError(new Error("Unexpected charactor: "
+ (char)c, lineNum));
cChar = (linePos - 1) + "个字符: '" + cChar + "' 错误!";
unGetNextChar();
}
else
{
c = (char)c;
cChar += (char)c;
c = getNextChar();
}
}//while 结束
for (int var = 0; var < cChar.Length; var++)
{
if (cChar[var] == '.')
dotNum++;
}
if (dotNum <= 1)
{
cToken.setCmm(NUM);
}
else
{
cToken.setCmm(ERROR);
errorList.addError(new Error("Unexpected charactor: "
+ (char)c, lineNum));
cChar = (linePos - 1) + "个字符: '" + cChar + "' 错误!";
unGetNextChar();
}
}
//产生词法分析的Token序列
public void genTokenList()
{
Tokenizer token = scan();
while (token.getCmm() != ENDFILE)
{
tokenList.Enqueue(token);
token = scan();
}
tokenList.Enqueue(token);
}
public Queue<int> getErrorLines()
{
return errorLines;
}
// 打印错误信息
private void printErrorInfo()
{
//产生词法分析的Token序列
genTokenList();
int errorNum = errorList.getErrorNum(), flag = 0;
if (errorNum == 0)
output += "分析成功,没有错误 !\n" + "开始 :\n";
else
{
if (errorNum == 1)
output += "源代码中共有一个错误 :\n" + "开始:\n";
else
output += "分析成功共有 :" + errorNum + " 错误:\n" + "开始:\n";
}
}
// 打印token序列
public string printTokenList()
{
//调用错误处理和Token序列产生函数
printErrorInfo();
//获得Token序列项数
int count = tokenList.Count;
//遍历tokenList
for (int i = 0; i < count; i++)
{
Tokenizer cToken = tokenList.Dequeue();
output += cToken.getLineNum() + ": ";
switch (cToken.getCmm())
{
case ASSIGN:
output += "等价符——>" + cToken.getSymbol() + "\n";
break;
case EQ:
case LT:
case GT:
case PLUS:
case MINUS:
case TIMES:
case OVER:
output += "运算符——>" + cToken.getSymbol() + "\n";
break;
case LPAREN:
case RPAREN:
case LBRACE:
case RBRACE:
case DOT:
case COMMA:
case SymbolI:
case LMIDPAREN:
case RMIDPAREN:
case UNDERANGE:
output += "分界符——>" + cToken.getSymbol() + "\n";
break;
case LCOMMENT:
output += "注释符——> /*" + cToken.getSymbol() + "\n";
break;
case RCOMMENT:
output += "注释符——>*/" + cToken.getSymbol() + "\n";
break;
case ID:
output += "标识符——> " + cToken.getSymbol() + "\n";
break;
case NUM:
output += "实数——> " + cToken.getSymbol() + "\n";
break;
case ENDFILE:
output += "结束\n";
break;
case ERROR:
output += "EORR: " + cToken.getSymbol() + "\n";
break;
default:
output += "保留字——> " + cToken.getSymbol() + "\n";
break;
}
}
return output;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -