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

📄 syntaxanalyze.java

📁 一种CMM语言的词法分析
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
	}
	
	//else处理
	private void elseClause(LinkedList<Tokens> listT,DefaultMutableTreeNode elseTree) {
		//添加子节点及输出
		DefaultMutableTreeNode elseTreeT = new DefaultMutableTreeNode("else 语句");
		elseTree.add(elseTreeT);
		syntaxOutput.add(showSpace() + "else 语句");
		tokenRightStart.add(listT.getFirst().start);
		tokenRightEnd.add(listT.getFirst().end);
		deep.add(countSpace);
		
		//错误 :语句长度过短
		if (listT.size() < 3) {
			keywordUseWrong(listT.getFirst());
			syntaxWrongOutput.add("    错误原因 :语句格式错误");
			tokenErrorStart.add(listT.getFirst().start);
			tokenErrorEnd.add(listT.getFirst().end);
			listT.clear();
		}
		else {
			//含有block
			if (listT.get(1).token.equals("{")) {
				int end = analyzeBracket(listT, "{", "}", 1);
				//错误 :block未结束
				if (end == -1) {
					syntaxWrong();
					syntaxWrongOutput.add("    括号无法匹配   #" + listT.get(1).lineNo);
					tokenErrorStart.add(listT.get(1).start);
					tokenErrorEnd.add(listT.get(1).end);
					
					//移除"else"及"{",对剩余内容进行分析
					listT.removeFirst();
					listT.removeFirst();
					syntaxAnalyze(elseTreeT, listT, true);
					listT.clear();
				}
				//正常block
				else if (end!= 2) 
					syntaxAnalyze(elseTreeT, new LinkedList<Tokens>(listT.subList(2, end)), true);
				
				//剩余待分析内容
				if (end == listT.size()) listT.clear();
				else listT = new LinkedList<Tokens>(listT.subList(end+1, listT.size()));
			}
			//else之后有执行语句且不使用大括号
			else {
				countSpace++;
				matchingAnalyze(
						new LinkedList<Tokens>(listT.subList(1, listT.size())), elseTreeT, false);
				countSpace--;
				//将临时内容加载
				listT = listTT;
			}
		}
		
		//将剩余待分析内容备份
		listTT = listT;
	}
	
	//计算对应括号位置
	/*参数含义:
	 * String bracket1 括号开的字符串("(","{","[")
	 * String bracket2 括号闭的对应字符串(")","}","]")
	 * int startIndex 括号开在listT中所在位置
	 */
	public int analyzeBracket(LinkedList<Tokens> listT, String bracket1, String bracket2, int startIndex) {
		//对应括号闭位置
		int end = -1;
		//括号开、闭的个数统计
		int count1 = 0;
		int count2 = 0;
		for (int i = startIndex; i < listT.size(); i++) {
			if (listT.get(i).token.equals(bracket1)) count1++;
			else if (listT.get(i).token.equals(bracket2)) count2++;
			if (count2 == count1) {
				end = i;
				break;
			} 
		}
		
		return end;
	}
	
	//重载:计算对应括号位置
	/*参数含义:
	 * String bracket1 括号开的字符串('('和'[')
	 * String bracket2 括号闭的对应字符串(')'和']')
	 * int startIndex 括号开在listT中所在位置
	 */
	public static int analyzeBracket(String str, char bracket1, char bracket2, int startIndex) {
		//对应括号闭位置
		int end = -1;
		//括号开、闭的个数统计
		int count1 = 0;
		int count2 = 0;
		for (int i = startIndex; i < str.length(); i++) {
			if (str.charAt(i) == bracket1) count1++;
			else if (str.charAt(i) == bracket2) count2++;
			if (count2 == count1) {
				end = i;
				break;
			} 
		}
		
		return end;
	}

	//声明int型变量并进行初始化
	private void declare(LinkedList<Tokens> listT, 
			DefaultMutableTreeNode declarationTree, boolean executeTimes) {
		//添加子节点
		DefaultMutableTreeNode declarationTreeT = new DefaultMutableTreeNode("int型变量声明");
		declarationTree.add(declarationTreeT);

		//不存在初始化的值
		if (listT.size()==3) {
			keywordUseWrong(listT.getFirst());
			syntaxWrongOutput.add("    错误原因 :声明变量格式错误");
			tokenErrorStart.add(listT.getFirst().start);
			tokenErrorEnd.add(listT.getFirst().end);
			listT.clear();
		}
		else {
			//变量声明是否正确结束
			boolean declareEnd = false;
			for (int i = 3; i < listT.size(); i++) {
				//变量声明正确结束
				if (listT.get(i).token.equals(";")) {
					declareEnd = true;
					
					//错误:没有赋值内容
					if (i==3) {
						keywordUseWrong(listT.getFirst());
						syntaxWrongOutput.add("    错误原因 :声明变量时赋值内容为空");	
						tokenErrorStart.add(listT.get(2).start);
						tokenErrorEnd.add(listT.get(3).end);
					}
					else {
						//添加子节点
						declarationTreeT.add(new DefaultMutableTreeNode("变量: " + listT.get(1).token));
						syntaxOutput.add(showSpace() + "变量声明:");
						tokenRightStart.add(listT.getFirst().start);
						tokenRightEnd.add(listT.getFirst().end);
						deep.add(countSpace);
						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 (arithmeticOperation(new LinkedList<Tokens>(listT.subList(3, i)), true, true))
							//添加子节点
							declarationTreeT.add(new DefaultMutableTreeNode("变量值: "+ arithmetic));
					}
						
					//剩余待分析内容
					if (i != listT.size()-1) 
						listT = new LinkedList<Tokens>(listT.subList(i+1, listT.size()));
					else listT.clear();
						
					break;
				}
			}
				
			//变量声明未正确结束
			if (declareEnd == false) {
				syntaxWrong();
				syntaxWrongOutput.add("    语句未结束    #" + listT.getFirst().lineNo);
				tokenErrorStart.add(listT.getFirst().start);
				tokenErrorEnd.add(listT.getFirst().end);
				
				//对赋值内容进行算术表达式分析
				arithmeticOperation(new LinkedList<Tokens>(listT.subList(3, listT.size())), false, true);
				listT.clear();
			}
		}
		
		//进入后续分析或分析结束并备份剩余待分析内容
		if (executeTimes)
			matchingAnalyze(listT, declarationTree, true);
		else listTT = listT;
	}	
	
	//声明数组变量
	private void arrayDeclare(LinkedList<Tokens> listT, 
			DefaultMutableTreeNode arrayTree, boolean executeTimes) {
		//添加子节点及输出
		DefaultMutableTreeNode arrayTreeT = new DefaultMutableTreeNode("array型变量声明");
		arrayTree.add(arrayTreeT);
		syntaxOutput.add(showSpace() + "变量声明:");
		tokenRightStart.add(listT.getFirst().start);
		tokenRightEnd.add(listT.getFirst().end);
		deep.add(countSpace);
		
		//此类语句所必须满足条件:
		//格式限制
		if (listT.size()<6 || (listT.size()==6 && !listT.get(5).token.equals(";"))) {
			keywordUseWrong(listT.getFirst());
			if (listT.size()<6) syntaxWrongOutput.add("    错误原因 :语句长度过短");
			else syntaxWrongOutput.add("    错误原因 :声明变量没有正确结束");
			tokenErrorStart.add(listT.getFirst().start);
			tokenErrorEnd.add(listT.getFirst().end);
			
			listT.clear();
		}
		else{
			//对应"]"所在位置
			int endBracket = analyzeBracket(listT, "[", "]", 2);
			//对应"]"不存在
			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(3, listT.size())), false, true);
				listT.clear();
			}
			else {
				//声明并初始化
				if (endBracket == 3) {
					//长度限制
					if (listT.size()<7) {
						declareWrong(listT.get(1));
						listT.clear();
					}
					//格式限制
					else if (!listT.get(4).token.equals("=") ) {
						listT.removeFirst();
						declareWrong(listT.getFirst());
						listT = statementWrong(listT, false);
					}
					else {
						//使用具体值进行初始化
						if (listT.get(5).token.equals("{")){
							//大括号结束位置
							int endBracketT = analyzeBracket(listT, "{", "}", 5);
							//没有对应大括号
							if (endBracketT == -1) {
								syntaxWrong();
								syntaxWrongOutput.add("    括号无法匹配    #" + listT.get(1).lineNo);
								tokenErrorStart.add(listT.get(5).start);
								tokenErrorEnd.add(listT.get(5).end);
								listT.clear();
							}
							else {
								//格式限制
								if (endBracketT==listT.size()-1 || 
										!listT.get(endBracketT+1).token.equals(";")){
									syntaxWrong();
									syntaxWrongOutput.add("    语句未结束    #" + listT.getFirst().lineNo);
									tokenErrorStart.add(listT.get(endBracketT).start);
									tokenErrorEnd.add(listT.get(endBracketT).end);
								}
								else {
									//用于存储数组变量值(字符串)
									String variableValue = "";
									//没有用于初始化数组变量的值
									if (endBracketT == 6) 
										declareWrong(listT.getFirst());
									else 
										//分析并保存数组变量的值
										variableValue = 
											arrayData(new LinkedList<Tokens>(listT.subList(6, endBracketT)));
									
									//数组变量值分析为正确
									if (!variableValue.equals("false")) {
										//添加子节点及输出
										arrayTreeT.add(
												new DefaultMutableTreeNode(
														"数组变量: " + listT.get(1).token));
										arrayTreeT.add(
												new DefaultMutableTreeNode(
														"数组变量值: {" + variableValue + "}"));
										
										syntaxOutput.add(showSpace() + "    数组变量:    " + 
												listT.get(1).token + "    #" + listT.get(1).lineNo);
										tokenRightStart.add(listT.get(1).start);
										tokenRightEnd.add(listT.get(3).end);
										deep.add(countSpace+1);
										syntaxOutput.add(showSpace() + "    数组变量值:    {" + 
												variableValue + "}    #" + listT.get(5).lineNo);
										tokenRightStart.add(listT.get(5).start);
										tokenRightEnd.add(listT.get(endBracketT).end);
										deep.add(countSpace+1);
									}
									//错误的数组变量值
									else {
										declareWrong(listT.get(1));
										syntaxWrongOutput.add("    错误原因 :错误的初始化值");
										tokenErrorStart.add(listT.get(5).start);
										tokenErrorEnd.add(listT.get(endBracketT).end);
									}
								}
								
								//剩余待分析内容
								if (endBracketT == listT.size()-1) listT.clear();
								//声明正确结束
								else if (listT.get(endBracketT+1).token.equals(";")) {
									if (endBracketT+1 == listT.size()-1) listT.clear();
									else listT = 
										new LinkedList<Tokens>(listT.subList(endBracketT+2, listT.size()));
								}
								else listT = 
									new LinkedList<Tokens>(listT.subList(endBracketT+1, listT.size())); 
							}
						}
						//使用变量初始化数组变量
						else if (listT.get(5).type==CMMI) {
							//声明正确结束
							if (listT.get(6).token.equals(";")) {
								//添加子节点及输出
								arrayTreeT.add(
										new DefaultMutableTreeNode(
												"数组变量: " + listT.get(1).token));
								arrayTreeT.add(
										new DefaultMutableTreeNode(
												"数组变量值: " + listT.get(5).token));
								syntaxOutput.add(showSpace() + "    数组变量:    " + 
										listT.get(1).token + "    #" + listT.get(1).lineNo);
								tokenRightStart.add(listT.get(1).start);
								tokenRightEnd.add(listT.get(3).end);
								deep.add(countSpace+1);
							
								syntaxOutput.add(showSpace() + "    数组变量值:    " + 
									listT.get(5).token + "    #" + listT.get(5).lineNo);
								tokenRightStart.add(listT.get(5).start);
								tokenRightEnd.add(listT.get(5).end);
								deep.add(countSpace+1);
								
								//剩余待分析内容
								if (listT.size()==7) listT.clear();
								else 
									listT = 
										new LinkedList<Tokens>(listT.subList(7, listT.size()));
							}
							//声明未正确结束
							else {
								syntaxWrong();
								syntaxWrongOutput.add("    语句未结束    #" + listT.getFirst().lineNo);
								tokenErrorStart.add(listT.get(5).start);
								tokenErrorEnd.add(listT.get(5).end);
								
								listT = 
									new LinkedList<Tokens>(listT.subList(6, listT.size()));
							}
						}
						//错误的数组变量初始化
						else {
							listT.removeFirst();
							declareWrong(listT.get(1));
							listT = statementWrong(listT, false);
						}
					}
				}
				//声明限定长度的数组而不初始化
				else {
					//存储声明数组变量时为指定数组长度的字符串
					String length = "";
					LinkedList<Tokens> listTTT = new LinkedList<Tokens>(listT.subList(3, endBracket));
					for (Tokens value: listTTT)
						length += value.token;
					
					//对数组长度的表达式进行算术表达式的分析,仅需要错误时的输出
					arithmeticOperation(listTTT, false, true);
					
					//格式限制
					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);
					}
					else {
						//添加子节点及输出
						arrayTreeT.add(
								new DefaultMutableTreeNode("数组变量: " + listT.get(1).token));
						arrayTreeT.add(
								new DefaultMutableTreeNode("数组变量长度: " + length));
						syntaxOutput.add(showSpace() + "    数组变量:    " + 
							listT.get(1).token + "    #" + listT.get(1).lineNo);
						tokenRightStart.add(listT.get(1).start);

⌨️ 快捷键说明

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