⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 syntaxanalyze.java

📁 一种CMM语言的词法分析
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
						tokenRightEnd.add(listT.get(1).end);
						deep.add(countSpace+1);
						syntaxOutput.add(showSpace() + "    数组变量长度:    " + length + 
							"    #" + listT.get(3).lineNo);
						tokenRightStart.add(listT.get(3).start);
						tokenRightEnd.add(listT.get(endBracket-1).end);
						deep.add(countSpace+1);
					}
					
					//剩余待分析内容
					if (endBracket == listT.size()-1) listT.clear();
					//数组变量声明正确结束
					else if (listT.get(endBracket+1).token.equals(";")) {
						if (endBracket+1 == listT.size()-1) listT.clear();
						else listT = 
							new LinkedList<Tokens>(listT.subList(endBracket+2, listT.size()));
					}
					else listT = new LinkedList<Tokens>(listT.subList(endBracket+1, listT.size()));
				}
			}
		}
		
		//进入后续分析或分析结束并备份剩余待分析内容
		if (executeTimes)
			matchingAnalyze(listT, arrayTree, true);
		else listTT = listT;
	}	
	
	//检测是否正确的数组值序列
	//错误序列以"false"作为返回值
	//正确则返回原数据的字符串序列
	//具体编码与arithmeticOperation方法编码相同以保证直接调用arithmetic方法
	private String arrayData(LinkedList<Tokens> listT) {
		//错误:以","结束的序列
		if (listT.getLast().token.equals(",")) return "false";
		
		//存储原数据的字符串序列
		String str1 = "";
		
		//存储待分析内容
		String strT = "";
		//存储经过格式转化之后的待分析内容
		String str2 = "";
		//小括号开、闭的个数
		int count1 = 0, count2 = 0;
		//中括号开、闭的个数
		int count3 = 0, count4 = 0;
		//依次编码
		for (Tokens value: listT) {
			strT += 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 (value.token.equals(",")) {
				//添加至原数据的字符串序列
				str1 += strT;
				
				//括号无法匹配
				if (count1!=count2||count3!=count4) {
					syntaxWrong();
					syntaxWrongOutput.add("    括号无法匹配    " + strT + "    #" + value.lineNo);
					tokenErrorStart.add(listT.getFirst().start);
					tokenErrorEnd.add(value.start);
					return "false";
				}
				
				//对数组值的每一项进行算术表达式的分析
				if (!str2.isEmpty() && arithmetic(str2)==false) return "false";
				
				//清空临时内容
				strT = "";
				str2 = "";
			}
			//待分析为其他内容
			else {
				syntaxWrong();
				syntaxWrongOutput.add("    算术表达式含有错误的内容");
				tokenErrorStart.add(value.start);
				tokenErrorEnd.add(value.start);
				return "false";
			}
		}

		//添加至原数据的字符串序列
		str1 += strT;
		
		//括号无法匹配
		if (count1!=count2||count3!=count4) {
			syntaxWrong();
			syntaxWrongOutput.add("    括号无法匹配    " + strT + "    #" + listT.getLast().lineNo); 
			tokenErrorStart.add(listT.getFirst().start);
			tokenErrorEnd.add(listT.getLast().end);
			return "false";
		}
		//对数组值的最后一项进行算术表达式的分析
		if (arithmetic(str2)==false) return "false";
		
		return str1;
	}
	
	//赋值语句
	private void evaluate(LinkedList<Tokens> listT, 
			DefaultMutableTreeNode assignmentTree, boolean executeTimes) {
		//添加子节点
		DefaultMutableTreeNode assignmentTreeT = new DefaultMutableTreeNode("赋值语句");
		assignmentTree.add(assignmentTreeT);
		
		//格式限制
		if (listT.size()>2 && listT.get(1).token.equals("=")){
			//添加子节点及输出
			assignmentTreeT.add(
					new DefaultMutableTreeNode("变量: " + listT.getFirst().token));
			syntaxOutput.add(showSpace() + "赋值语句:");
			tokenRightStart.add(listT.getFirst().start);
			tokenRightEnd.add(listT.getFirst().end);
			deep.add(countSpace);
			syntaxOutput.add(showSpace() + "    变量:    " + listT.getFirst().token + 
				"   #" + listT.getFirst().lineNo);
			tokenRightStart.add(listT.getFirst().start);
			tokenRightEnd.add(listT.getFirst().end);
			deep.add(countSpace + 1);
			
			//使用数组变量值对数组变量赋值
			if (listT.get(2).token.equals("{")) {
				//长度限制
				if (listT.size()<6) {
					syntaxWrong();
					syntaxWrongOutput.add("    错误的赋值语句    #" + listT.get(2).lineNo);
					tokenErrorStart.add(listT.getFirst().start);
					tokenErrorEnd.add(listT.getLast().end);
					listT.clear();
				}
				else {
					//对应大括号结束位置
					int endBracket = analyzeBracket(listT,"{", "}", 2);
					
					//错误:不存在对应大括号
					if (endBracket == -1){
						syntaxWrong();
						syntaxWrongOutput.add("    没有对应括号    #" + listT.get(2).lineNo);
						tokenErrorStart.add(listT.get(2).start);
						tokenErrorEnd.add(listT.get(2).end);
						listT = statementWrong(listT, false);
					}
					else {
						//错误:语句未结束
						if (endBracket==listT.size()-1 || 
								!listT.get(endBracket+1).token.equals(";")){
							syntaxWrong();
							syntaxWrongOutput.add("    语句未结束    #" + listT.getFirst().lineNo);
							tokenErrorStart.add(listT.get(endBracket).start);
							tokenErrorEnd.add(listT.get(endBracket).end);
						}
						
						//用于存储数组变量值(字符串)
						String variableValue = "";
						//格式限制
						if (endBracket == 3) 
							declareWrong(listT.getFirst());
						else 
							//分析并保存数组变量的值
							variableValue = 
								arrayData(new LinkedList<Tokens>(listT.subList(3, endBracket)));
						
						//数组变量值分析为正确
						if (!variableValue.equals("false")) {
							//添加子节点及输出
							assignmentTreeT.add(
									new DefaultMutableTreeNode("变量值: {" + variableValue + "}"));
							
							syntaxOutput.add(showSpace() + "    变量值:    {" + 
								variableValue + "}    #" + listT.get(2).lineNo);
							tokenRightStart.add(listT.get(2).start);
							tokenRightEnd.add(listT.get(endBracket).end);
							deep.add(countSpace+1);
						}
						//错误的数组变量值
						else {
							declareWrong(listT.get(1));
							syntaxWrongOutput.add("    错误原因 :错误的初始化");
							tokenErrorStart.add(listT.get(2).start);
							tokenErrorEnd.add(listT.get(endBracket).end);
						}
						
						//剩余待分析部分
						
						if (endBracket == listT.size()-1) listT.clear();
						else if (listT.get(endBracket+1).token.equals(";")) {
							if (endBracket+1 == listT.size()-1) listT.clear();
							else listT = 
								new LinkedList<Tokens>(listT.subList(endBracket+2, listT.size()));
						}
						else listT = 
							new LinkedList<Tokens>(listT.subList(endBracket+1, listT.size()));
					}
				}
			}
			//使用算术表达式对变量进行赋值
			else {
				//赋值语句是否正确结束
				boolean assignmentNotEnd = false;
				for (int i = 0; i < listT.size(); i++) {
					if (listT.get(i).token.equals(";")) {
						//赋值语句正确结束
						assignmentNotEnd = true;
						
						//对赋值内容进行算术表达式分析,添加需要字节点						
						if (arithmeticOperation(new LinkedList<Tokens>(listT.subList(2, i)), true, true))
							assignmentTreeT.add(new DefaultMutableTreeNode("变量值: " + arithmetic));
						
						//剩余待分析内容
						if (i != listT.size()-1) 
							listT = new LinkedList<Tokens>(listT.subList(i+1, listT.size()));
						else listT.clear();
								
						break;
					}
				}
				
				//赋值语句未正确结束
				if (assignmentNotEnd == false) {
					syntaxWrong();
					syntaxWrongOutput.add("    语句未结束    #" + listT.getFirst().lineNo);
					tokenErrorStart.add(listT.getFirst().start);
					tokenErrorEnd.add(listT.getLast().end);
					
					//对赋值部分进行算术表达式分析
					arithmeticOperation(new LinkedList<Tokens>(listT.subList(2, listT.size())), false, true);
					listT.clear();
				}
			}
		}
		//对数组变量指定索引处的赋值
		else if (listT.size()>2 && listT.get(1).token.equals("[")){
			//对应括号结束位置
			int endBracket = analyzeBracket(listT, "[", "]", 1);
			//没有对应括号闭
			if (endBracket==-1){
				syntaxWrong();
				syntaxWrongOutput.add("    括号无法匹配    #" + listT.get(1).lineNo);
				tokenErrorStart.add(listT.get(1).start);
				tokenErrorEnd.add(listT.get(1).end);
				
				//对索引部分进行算术表达式分析
				arithmeticOperation(new LinkedList<Tokens>(listT.subList(2, listT.size())), false, true);
				listT.clear();
			}
			else {
				//用于存储待赋值变量
				String strT = "";
				for (Tokens value: new LinkedList<Tokens>(listT.subList(0, endBracket+1)))
					strT+=value.token;
				//添加子节点及输出
				assignmentTreeT.add(new DefaultMutableTreeNode("变量: " + strT));
				syntaxOutput.add(showSpace() + "赋值语句:");
				tokenRightStart.add(listT.getFirst().start);
				tokenRightEnd.add(listT.get(endBracket).end);
				deep.add(countSpace);
				
				//没有索引值
				if (endBracket==2) {
					syntaxWrong();
					syntaxWrongOutput.add("    错误的赋值语句    #" + listT.get(2).lineNo);
					tokenErrorStart.add(listT.getFirst().start);
					tokenErrorEnd.add(listT.get(2).end);
				}
				else 
					//对索引值进行算术表达式分析,需要错误时的输出
					arithmeticOperation(new LinkedList<Tokens>(listT.subList(2, endBracket)), false, true);
				
				//输出
				syntaxOutput.add(showSpace() + "    变量:    " + strT + "    #" + listT.getFirst().lineNo);
				tokenRightStart.add(listT.getFirst().start);
				tokenRightEnd.add(listT.get(endBracket).end);
				deep.add(countSpace + 1);
				
				//格式限制
				if (endBracket==listT.size()-1 || endBracket==listT.size()-2 || 
						!listT.get(endBracket+1).token.equals("=")) {
					syntaxWrong();
					syntaxWrongOutput.add("    错误的赋值语句    #" + listT.get(endBracket+1).lineNo);
					tokenErrorStart.add(listT.getFirst().start);
					tokenErrorEnd.add(listT.get(endBracket).end);
					
					//剩余待分析内容
					if (endBracket == listT.size()-1 || endBracket == listT.size()-2) listT.clear();
					else listT = new LinkedList<Tokens>(listT.subList(endBracket+1, listT.size()));
				}
				else {
					//赋值语句是否正确结束
					boolean assignmentNotEnd = false;
					for (int i = endBracket+2; i < listT.size(); i++) {
						if (listT.get(i).token.equals(";")) {
							//赋值语句正确结束
							assignmentNotEnd = true;
							
							//对赋值内容进行算术表达式分析,添加正确及错误时的输出
							if(arithmeticOperation(
									new LinkedList<Tokens>(listT.subList(endBracket+2, i)), true, true))
								//添加子节点
								assignmentTreeT.add(new DefaultMutableTreeNode("变量值: " + arithmetic));
							
							//剩余待分析内容
							if (i != listT.size()-1) 
								listT = new LinkedList<Tokens>(listT.subList(i+1, listT.size()));
							else listT.clear();
									
							break;
						}
					}
					
					//赋值语句未正确结束
					if (assignmentNotEnd == false) {
						syntaxWrong();
						syntaxWrongOutput.add("    语句未结束    #" + listT.getFirst().lineNo);
						tokenErrorStart.add(listT.getFirst().start);
						tokenErrorEnd.add(listT.getLast().end);
						
						//对赋值部分进行算术表达式的分析,仅需要进行错误输出
						arithmeticOperation(new LinkedList<Tokens>(listT.subList(endBracket+2, listT.size())), 
								false, true);
						
						listT.clear();
					}
				}
			}		
		}
		//不满足赋值语句格式限制
		else {
			syntaxWrong();
			listT = statementWrong(listT, true);
		}
		
		//进入后续分析或分析结束并备份剩余待分析内容
		if (executeTimes) 
			matchingAnalyze(listT, assignmentTree, true);
		else listTT = listT;
	}
		
	//读入变量值
	private void read(LinkedList<Tokens> listT, 
			DefaultMutableTreeNode readTree, boolean executeTimes) {
		//添加子节点
		DefaultMutableTreeNode readTreeT = new DefaultMutableTreeNode("读入");
		readTree.add(readTreeT);
		syntaxOutput.add(showSpace() + "读入:");
		tokenRightStart.add(listT.getFirst().start);
		tokenRightEnd.add(listT.getFirst().end);
		deep.add(countSpace);
		
		//格式限制
		if (listT.size()<3 || listT.get(1).type!=CMMI) {
			keywordUseWrong(listT.getFirst());
			syntaxWrongOutput.add("    错误原因 :read语句格式错误");
			tokenErrorStart.add(listT.getFirst().start);
			tokenErrorEnd.add(listT.getLast().end);
			
			//剩余待分析内容
			if (listT.size()<3) listT.clear();
			else listT.removeFirst();
		}
		else {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -