📄 syntaxanalyze.java
字号:
//读入变量值
if (listT.get(2).token.equals(";")) {
readTreeT.add(new DefaultMutableTreeNode(listT.get(1).token));
syntaxOutput.add(showSpace() + " " + listT.get(1).token + " #" + listT.get(1).lineNo);
tokenRightStart.add(listT.get(1).start);
tokenRightEnd.add(listT.get(1).end);
deep.add(countSpace + 1);
//剩余待分析内容
if (listT.size()==3) listT.clear();
else listT = new LinkedList<Tokens>(listT.subList(3, listT.size()));
}
//读入数组指定索引处的值
else if (listT.get(2).token.equals("[")) {
//对应括号结束位置
int endBracket = analyzeBracket(listT, "[", "]", 2);
//不存在对应括号闭
if (endBracket==-1) {
syntaxWrong();
syntaxWrongOutput.add(" 括号无法匹配 #" + listT.get(1).lineNo);
tokenErrorStart.add(listT.get(2).start);
tokenErrorEnd.add(listT.get(2).end);
listT.clear();
}
else {
//用于存储待读入的变量
String strT = "";
for (Tokens value: new LinkedList<Tokens>(listT.subList(1, endBracket+1)))
strT+=value.token;
readTreeT.add(new DefaultMutableTreeNode(strT));
syntaxOutput.add(showSpace() + " " + strT + " #" + listT.get(1).lineNo);
tokenRightStart.add(listT.get(1).start);
tokenRightEnd.add(listT.get(endBracket).end);
deep.add(countSpace + 1);
//不含有索引内容
if (endBracket==3) {
syntaxWrong();
syntaxWrongOutput.add(" 没有数组索引 #" + listT.get(3).lineNo);
tokenErrorStart.add(listT.get(1).start);
tokenErrorEnd.add(listT.get(3).end);
}
else
//对索引进行算术表达式分析,需要进行错误时的输出
arithmeticOperation(new LinkedList<Tokens>(listT.subList(3, endBracket)), false, true);
//错误情况及剩余待分析内容
if (endBracket==listT.size()-1) {
syntaxWrong();
syntaxWrongOutput.add(" 语句未结束 #" + listT.get(endBracket).lineNo);
tokenErrorStart.add(listT.get(endBracket).start);
tokenErrorEnd.add(listT.get(endBracket).end);
listT.clear();
}
else if (!listT.get(endBracket+1).token.equals(";")) {
syntaxWrong();
syntaxWrongOutput.add(" 语句未结束 #" + listT.get(endBracket).lineNo);
tokenErrorStart.add(listT.get(endBracket).start);
tokenErrorEnd.add(listT.get(endBracket+1).end);
listT = new LinkedList<Tokens>(listT.subList(endBracket+1, listT.size()));
}
else {
if (endBracket+1 == listT.size()-1) listT.clear();
else listT = new LinkedList<Tokens>(listT.subList(endBracket+2, listT.size()));
}
}
}
//错误的读入语句
else {
keywordUseWrong(listT.getFirst());
syntaxWrongOutput.add(" 错误原因 :read语句格式错误");
tokenErrorStart.add(listT.getFirst().start);
tokenErrorEnd.add(listT.get(2).end);
listT = new LinkedList<Tokens>(listT.subList(2, listT.size()));
}
}
//进入后续分析或分析结束并备份剩余待分析内容
if (executeTimes)
matchingAnalyze(listT, readTree, true);
else listTT = listT;
}
//输出数据
private void write(LinkedList<Tokens> listT,
DefaultMutableTreeNode writeTree, boolean executeTimes) {
//添加子节点
DefaultMutableTreeNode writeTreeT = new DefaultMutableTreeNode("输出");
writeTree.add(writeTreeT);
syntaxOutput.add(showSpace() + "输出:");
tokenRightStart.add(listT.getFirst().start);
tokenRightEnd.add(listT.getFirst().end);
deep.add(countSpace);
//格式限制
if (listT.size()<3) {
keywordUseWrong(listT.getFirst());
syntaxWrongOutput.add(" 错误原因 :write语句格式错误");
tokenErrorStart.add(listT.getFirst().start);
tokenErrorEnd.add(listT.getLast().end);
listT.clear();
}
else {
//输出语句的结束位置
int end = -1;
for (int i = 0; i < listT.size(); i++) {
if (listT.get(i).token.equals(";")) {
end = i;
break;
}
}
//输出语句未结束
if (end == -1) {
keywordUseWrong(listT.getFirst());
syntaxWrongOutput.add(" 错误原因 :write语句未结束");
tokenErrorStart.add(listT.getFirst().start);
tokenErrorEnd.add(listT.getLast().end);
//对输出部分进行算术表达式分析,仅需要错误时的输出
arithmeticOperation(new LinkedList<Tokens>(listT.subList(1, listT.size())), false, true);
listT.clear();
}
else {
//用于存储待输出语句的内容
String strT = "";
for (Tokens value: new LinkedList<Tokens>(listT.subList(1, end)))
strT += value.token;
//添加子节点及输出
writeTreeT.add(new DefaultMutableTreeNode(strT));
syntaxOutput.add(showSpace() + " " + strT + " #" + listT.getFirst().lineNo);
tokenRightStart.add(listT.get(1).start);
tokenRightEnd.add(listT.get(end-1).end);
deep.add(countSpace + 1);
//对输出部分进行算术表达式分析,仅需要错误时的输出
arithmeticOperation(new LinkedList<Tokens>(listT.subList(1, end)), false, true);
//剩余待分析内容
if (end == listT.size()-1) listT.clear();
else listT = new LinkedList<Tokens>(listT.subList(end+1, listT.size()));
}
}
//进入后续分析或分析结束并备份剩余待分析内容
if (executeTimes)
matchingAnalyze(listT, writeTree, true);
else listTT = listT;
}
//循环语句
private void loop(LinkedList<Tokens> listT,
DefaultMutableTreeNode loopTree, boolean executeTimes) {
//添加子节点并输出
DefaultMutableTreeNode loopTreeT = new DefaultMutableTreeNode("循环语句");
loopTree.add(loopTreeT);
syntaxOutput.add(showSpace() + "while 语句");
tokenRightStart.add(listT.getFirst().start);
tokenRightEnd.add(listT.getFirst().end);
deep.add(countSpace);
//格式限制
if (listT.size() < 3 || !(listT.get(1).token.equals("("))) {
keywordUseWrong(list.getFirst());
syntaxWrongOutput.add(" 错误原因 :循环语句格式错误");
tokenErrorStart.add(listT.getFirst().start);
tokenErrorEnd.add(listT.getLast().end);
listT.clear();
}
else {
//计算对应括号位置
int end1 = analyzeBracket(listT, "(", ")", 1);
//错误:没有对应括号结束
if (end1 == -1) {
syntaxWrong();
syntaxWrongOutput.add(" 括号无法匹配 #" + listT.get(1).lineNo);
tokenErrorStart.add(listT.get(1).start);
tokenErrorEnd.add(listT.get(1).end);
listT.clear();
}
//错误:没有布尔表达式
else if (end1 == 2) {
syntaxWrong();
syntaxWrongOutput.add(" 没有布尔表达式 #" + listT.get(end1).lineNo);
tokenErrorStart.add(listT.get(1).start);
tokenErrorEnd.add(listT.get(2).end);
}
//含有布尔表达式
else {
boolean bracketWrong = false;
for (int i = 2; i < end1; i++) {
//错误:布尔表达式中含有大括号
if (listT.get(i).token.equals("{") || listT.get(i).token.equals("}")) {
bracketWrong = true;
syntaxWrong();
syntaxWrongOutput.add(" 括号使用有误 #" + listT.get(i).lineNo);
tokenErrorStart.add(listT.get(i).start);
tokenErrorEnd.add(listT.get(i).end);
break;
}
}
if (bracketWrong) {}
//括号中为real
else if (end1==3 && listT.get(2).token.equals("real")) {
loopTreeT.add(new DefaultMutableTreeNode("布尔值: real"));
syntaxOutput.add(showSpace() + " 布尔值: real #" + listT.get(2).lineNo);
tokenRightStart.add(listT.get(2).start);
tokenRightEnd.add(listT.get(2).end);
deep.add(countSpace + 1);
}
//括号中为布尔表达式
else {
countSpace++;
relationOperation(new LinkedList<Tokens>(listT.subList(2, end1)),loopTreeT);
countSpace--;
}
//含有执行语句
if (end1!=listT.size()-1) {
//含有block
if (listT.get(end1+1).token.equals("{")) {
//block结束位置
int end2 = analyzeBracket(listT, "{", "}",end1+1);
//block未结束
if (end2 == -1) {
keywordUseWrong(listT.getFirst());
syntaxWrongOutput.add(" 括号无法匹配");
tokenErrorStart.add(listT.get(end1+1).start);
tokenErrorEnd.add(listT.get(end1+1).end);
listT.clear();
}
//block正常结束
else {
//block中含有执行语句 对其进行分析
if (end2!=end1+1) {
syntaxAnalyze(loopTreeT,
new LinkedList<Tokens>(listT.subList(end1+2, end2)), true);
}
//剩余待分析内容
if (end2!=listT.size()-1)
listT = new LinkedList<Tokens>(listT.subList(end2+1, listT.size()));
else listT.clear();
}
}
else {
//while之后有执行语句且不使用大括号
//仅进行一次分析
countSpace++;
matchingAnalyze(
new LinkedList<Tokens>(listT.subList(end1+1, listT.size())), loopTreeT, false);
countSpace--;
listT = listTT;
}
}
//错误:不含有执行语句
else {
keywordUseWrong(listT.getFirst());
syntaxWrongOutput.add(" 错误原因 :不含有执行语句");
tokenErrorStart.add(listT.getFirst().start);
tokenErrorEnd.add(listT.getLast().end);
listT.clear();
}
}
}
//进入后续分析或分析结束并备份剩余待分析内容
if (executeTimes)
matchingAnalyze(listT, loopTree, true);
else listTT = listT;
}
//算术表达式
//boolean needTreeNode 调用此函数是否需要单独添加字节点
private boolean arithmeticOperation(LinkedList<Tokens> listT,
boolean needRightOutput, boolean needWrongOutput) {
//存储待分析内容
String str1 = "";
//存储经过格式转化之后的待分析内容
String str2 = "";
//括号开、闭的个数
int count1 = 0, count2 = 0;
int count3 = 0, count4 = 0;
//依次添加
for (Tokens value: listT) {
str1 += value.token;
//待分析为数字
if (value.type == CMMN) str2+=0;
//待分析为标志符
else if (value.type == CMMI) str2+=1;
//待分析为"+"或"-"
else if (value.token.equals("+") || value.token.equals("-")) str2+=2;
//待分析为"*"或"/"
else if (value.token.equals("*") || value.token.equals("/")) str2+=3;
//待分析为"("
else if (value.token.equals("(")) {
str2+=4;count1++;
}
//待分析为")"
else if (value.token.equals(")")) {
str2+=5;count2++;
}
//待分析为"["
else if (value.token.equals("[")) {
str2+=6;count3++;
}
//待分析为"]"
else if (value.token.equals("]")) {
str2+=7;count4++;
}
//待分析为其他内容
else {
if (needWrongOutput == true) {
syntaxWrongOutput.add(" 算术表达式含有错误的内容");
tokenErrorStart.add(value.start);
tokenErrorEnd.add(value.end);
}
return false;
}
}
//括号开、闭的个数不同
if (count1!=count2 || count3!=count4) {
if (needWrongOutput == true) {
syntaxWrongOutput.add(" 算术表达式括号无法匹配");
tokenErrorStart.add(listT.getFirst().start);
tokenErrorEnd.add(listT.getLast().end);
}
return false;
}
//分析经过格式转化之后的待分析内容
//分析结果为正确
if (arithmetic(str2)) {
arithmetic = str1;
//输出
if (needRightOutput == true) {
syntaxOutput.add(showSpace() + " 算术表达式:" + str1 +
" #" + listT.getFirst().lineNo);
tokenRightStart.add(listT.getFirst().start);
tokenRightEnd.add(listT.getLast().end);
deep.add(countSpace + 1);
}
return true;
}
//分析结果为错误
else {
syntaxWrongOutput.add(
showSpace() + " 算术表达式:" + str1 + " 错误 #" + listT.getFirst().lineNo);
tokenErrorStart.add(listT.getFirst().start);
tokenErrorEnd.add(listT.getLast().end);
return false;
}
}
//分析算术表达式
//String str 经过格式转化之后的待分析内容
private boolean arithmetic(String str) {
//生成不含有括号的字符串
//含有小括号或中括号时
while (str.indexOf('4') + str.indexOf('6')!=-2) {
//长度限制
if (str.length()==2)return false;
//括号开第一次出现的位置
int start = -1;
for (int i =0; i < str.length(); i++) {
//找到第一个括号开
if (str.charAt(i)=='4' || str.charAt(i)=='6') {
start = i;
//错误:数组索引前非变量
if (str.charAt(i)=='6' && (i==0||!(str.charAt(i-1)=='1'))) {
return false;
}
break;
}
}
//对应的括号
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -