亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? syntaxanalyze.java

?? 一種CMM語言的詞法分析
?? JAVA
?? 第 1 頁 / 共 5 頁
字號:
/*
*  呂淵 200532580144
*  使用工具:eclipse
*  Java SE 6
*  
*  完成日期 2007-10-21
*  			*** 生日紀念
*/
import java.util.*;
import javax.swing.tree.DefaultMutableTreeNode;
import java.util.regex.Pattern;

public class SyntaxAnalyze extends LexicalAnalyze{
	//用于存儲節點
	public DefaultMutableTreeNode syntaxTree= new DefaultMutableTreeNode("Syntax Tree");
	//正確及出現錯誤時候的輸出
	private ArrayList<String> syntaxOutput = new ArrayList<String>(); 
	private ArrayList<String> syntaxWrongOutput = new ArrayList<String>();
	public ArrayList<Integer> tokenRightStart = new ArrayList<Integer>();
	public ArrayList<Integer> tokenRightEnd = new ArrayList<Integer>();
	public ArrayList<Integer> tokenErrorStart = new ArrayList<Integer>();
	public ArrayList<Integer> tokenErrorEnd = new ArrayList<Integer>();
	
	//用于計數輸出時預留的空格數
	private int countSpace = -1;
	
	//用于存儲嵌套的層次及行號
	public LinkedList<Integer> deep = new LinkedList<Integer>();
	
	//是否出現語法錯誤
	public boolean syntaxError = false;
	
	//進行一次語法分析操作后臨時存儲剩余內容
	//條件語句、循環語句中僅有單行執行語句且無大括號時使用
	private LinkedList<Tokens> listTT = new LinkedList<Tokens>();
	
	//用語存儲待分析內容的字符串值
	private String arithmetic = ""; 
	
	//構造方法
	public SyntaxAnalyze(String inputString) {
		super(inputString);
		
		//詞法分析未發現錯誤
		if (lexicalError == false)
			syntaxAnalyze(syntaxTree, list, true);
		else syntaxError = true;
	}
	
	//語法分析
	/*以下函數參數含義:
	 * DefaultMutableTreeNode 父節點
	 * 	 	(條件語句中從if到else if及到else對其分析過程只計為一次分析,并非單獨進入語法分析的循環執行,父節點相同);
	 * LinkedList<Tokens> listT 待分析內容;
	 * boolean executeTimes 所需分析的次數
	 * 		(true表示需進入循環將待分析內容分析完畢,false則只分析一次語句并將剩余結果存入listTT中).
	 */
	private void syntaxAnalyze(DefaultMutableTreeNode tree, 
			LinkedList<Tokens> listT, boolean executeTimes){
		countSpace++;
		matchingAnalyze(listT, tree, executeTimes);
		countSpace--;
	}
	
	//匹配分析
	private void matchingAnalyze(LinkedList<Tokens> listT, 
			DefaultMutableTreeNode matchingTree, boolean executeTimes) {
		//空的剩余內容無操作
		if (listT.size()==0){}
		//剩余內容以保留字開始
		else if (listT.get(0).type == CMMK) {
			keywordMatch(listT, matchingTree, executeTimes);
		}
		//以標志符開始
		else if (listT.get(0).type == CMMI) {
			evaluate(listT, matchingTree, executeTimes);
		}
		//其他開始方式
		else {
			//以大括號開始
			if (listT.getFirst().token.equals("{")) {
				//計算大括號結束位置
				int end = analyzeBracket(listT, "{", "}", 0);
				if (end == listT.size()-1) {
					listT.removeLast();
					listT.removeFirst();
					matchingAnalyze(listT, matchingTree, executeTimes);
				}
				else 
					matchingAnalyze(statementWrong(listT, true), matchingTree, executeTimes);
			}
			else if (listT.getFirst().token.equals(";")) {
				listT.removeFirst();

				//進入后續分析或分析結束并備份剩余待分析內容
				if (executeTimes)
					matchingAnalyze(listT, matchingTree, executeTimes);
				else
					listTT = listT;
			}
			//其他各種錯誤開始方式
			else 
				matchingAnalyze(statementWrong(listT, true), matchingTree, executeTimes);
		}
	}
	
	//以保留字開始的匹配分析
	private void keywordMatch(LinkedList<Tokens> listT, 
			DefaultMutableTreeNode keywordMatchTree, boolean executeTimes) {
		//以if開始
		if (listT.getFirst().token.equals("if")) {
			//添加子節點及輸出
			DefaultMutableTreeNode ifTreeT = new DefaultMutableTreeNode("條件語句");
			keywordMatchTree.add(ifTreeT);
			syntaxOutput.add(showSpace() + "條件語句:");
			tokenRightStart.add(listT.getFirst().start);
			tokenRightEnd.add(listT.getFirst().end);
			deep.add(countSpace);
			
			countSpace++;
			//進入條件語句的分析
			ifClause(listT, ifTreeT, false);
			countSpace--;
			
			//是否進入后續分析
			if (executeTimes) 
				matchingAnalyze(listTT, keywordMatchTree, true);
		}
		//以real開始
		else if (listT.getFirst().token.equals("real")) {
			matchingAnalyze(statementWrong(listT, true), keywordMatchTree, executeTimes);
		}
		//以else開始
		else if (listT.getFirst().token.equals("else")) {
			elseBlockWrong(listT, executeTimes);
		}
		//以while開始
		else if (listT.getFirst().token.equals("while")) {
			loop(listT, keywordMatchTree, executeTimes);
		}
		//以read開始
		else if (listT.getFirst().token.equals("read")) {
			read(listT, keywordMatchTree, executeTimes);
		}
		//以write開始
		else if (listT.getFirst().token.equals("write")) {
			write(listT, keywordMatchTree, executeTimes);
		}
		//以int開始
		else {
			//長度限制
			if (listT.size()<3) {
				keywordUseWrong(listT.getFirst());
				syntaxWrongOutput.add("    錯誤原因 :語句長度過短");
				tokenErrorStart.add(listT.getFirst().start);
				tokenErrorEnd.add(listT.getFirst().end);
				listT.clear();
				listTT = listT;
			}
			//格式限制
			else if (listT.get(1).type!=CMMI) {
				syntaxWrong();
				syntaxWrongOutput.add("    錯誤的變量聲明    #" + listT.getFirst().lineNo);
				tokenErrorStart.add(listT.getFirst().start);
				tokenErrorEnd.add(listT.getFirst().end);
				listT.removeFirst();
				listT = statementWrong(listT, true);
				
				//進入后續分析或分析結束并備份剩余待分析內容
				if (executeTimes)
					matchingAnalyze(listT, keywordMatchTree, executeTimes);
				else
					listTT = listT;
			}
			else {
				//聲明int型變量不進行初始化
				if (listT.get(2).token.equals(";")) {
					//添加子節點及輸出
					DefaultMutableTreeNode declarationTree = new DefaultMutableTreeNode("int型變量聲明");
					keywordMatchTree.add(declarationTree);
					declarationTree.add(new DefaultMutableTreeNode("變量: " + listT.get(1).token));
					
					syntaxOutput.add(showSpace() + "變量聲明:");
					deep.add(countSpace);
					tokenRightStart.add(listT.getFirst().start);
					tokenRightEnd.add(listT.getFirst().end);
					syntaxOutput.add(showSpace() + "    變量: " + listT.get(1).token + 
					    "    #" + listT.get(1).lineNo);
					deep.add(countSpace + 1); 
					tokenRightStart.add(listT.get(1).start);
					tokenRightEnd.add(listT.get(1).end);
					
					
					//剩余待分析內容
					if (listT.size()==3) listT.clear();
					else 
						listT = new LinkedList<Tokens>(listT.subList(3, listT.size()));
					
					//進入后續分析或分析結束并備份剩余待分析內容
					if (executeTimes)
						matchingAnalyze(listT, keywordMatchTree, executeTimes);
					else
						listTT = listT;
				}
				//聲明int型變量并進行初始化
				else if (listT.get(2).token.equals("="))
					declare(listT, keywordMatchTree, executeTimes);
				//聲明數組變量
				else if (listT.get(2).token.equals("["))
					arrayDeclare(listT, keywordMatchTree, executeTimes);
				//錯誤的變量聲明
				else {
					keywordUseWrong(listT.getFirst());
					listT.removeFirst();
					listT = statementWrong(listT, true);
					
					//進入后續分析或分析結束并備份剩余待分析內容
					if (executeTimes)
						matchingAnalyze(listT, keywordMatchTree, executeTimes);
					else
						listTT = listT;
				}
			}
		}
	}
	
	//條件語句
	//if及if else處理
	//block表示進入的是if或else if語句內容(false表示if,true為else if)
	private void ifClause(LinkedList<Tokens> listT, DefaultMutableTreeNode ifTree, boolean block) {
		//添加子節點及輸出
		String str = "";
		str += block ? "else if" : "if";
		DefaultMutableTreeNode ifTreeT = new DefaultMutableTreeNode(str + " 語句");
		ifTree.add(ifTreeT);
		syntaxOutput.add(showSpace() + str + " 語句");
		tokenRightStart.add(listT.getFirst().start);
		if (block) listT.removeFirst();
		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();
			listTT = listT;
		}
		//錯誤:if之后非小括號
		else if (!(listT.get(1).token.equals("("))) {
			keywordUseWrong(listT.getFirst());
			syntaxWrongOutput.add("    錯誤原因 : if  之后非小括號\n");
			tokenErrorStart.add(listT.get(1).start);
			tokenErrorEnd.add(listT.get(1).end);
			listT.removeFirst();
			listTT = listT;
		}
		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(1).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")){
						//添加子節點及輸出
						ifTreeT.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)),ifTreeT);
						countSpace--;
					}
					//含有執行語句
					if (end1!=listT.size()-1) {
						boolean noBlock = true;
						//含有block
						if (listT.get(end1+1).token.equals("{")) {
							noBlock = false;
							//block結束位置
							int end2 = analyzeBracket(listT, "{", "}",end1+1);
							//block未結束
							if (end2 == -1) {
								syntaxWrong();
								syntaxWrongOutput.add("    括號無法匹配   #" + listT.get(1).lineNo);
								tokenErrorStart.add(listT.get(end1+1).start);
								tokenErrorEnd.add(listT.get(end1+1).end);
								listT.clear();
							}
							//block正常結束
							else {
								//block中含有執行語句 對其進行分析
								if (end2!=end1+2) 
									syntaxAnalyze(ifTreeT, 
										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();
							}
							//存入臨時內容中
							listTT = listT;
						}
						//if及else if之后有執行語句且不使用大括號
						//僅進行一次分析
						else {
							countSpace++;
							matchingAnalyze(
									new LinkedList<Tokens>(listT.subList(end1+1, listT.size())), 
									ifTreeT, false);
							countSpace--;
						}
						
						//將臨時內容加載
						if (noBlock) 
							listT = listTT;
						
						//含有待分析內容,以else開始
						if (!listT.isEmpty() && listT.getFirst().token.equals("else")) {
							//錯誤:剩余內容僅為單獨else
							if (listT.size()==1){
								keywordUseWrong(listT.getFirst());
								syntaxWrongOutput.add("    錯誤原因 :單獨的else");
								tokenErrorStart.add(listT.getFirst().start);
								tokenErrorEnd.add(listT.getFirst().end);
								listT.clear();
							}
							else {
								//待分析內容為else if語句
								if (listT.get(1).token.equals("if")) 
									ifClause(listT, ifTree, true);
								//待分析內容為else語句
								else 
									elseClause(listT, ifTree);
							}
						}
					}
					//錯誤:不含有執行語句
					else {
						keywordUseWrong(listT.getFirst());
						syntaxWrongOutput.add("    錯誤原因 :沒有執行語句");
						tokenErrorStart.add(listT.getFirst().start);
						tokenErrorEnd.add(listT.getFirst().end);
						listT.clear();
					}
				}
			}
		}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
99综合电影在线视频| 91国内精品野花午夜精品| 99re成人精品视频| 日韩一卡二卡三卡国产欧美| 中文字幕一区在线观看视频| 久久精品国产亚洲aⅴ| 色国产精品一区在线观看| 久久久不卡影院| 蜜臀va亚洲va欧美va天堂| 日本韩国欧美在线| 国产精品传媒在线| 国产成人午夜99999| 91精品国产综合久久精品图片| 国产精品人成在线观看免费| 精品一二线国产| 欧美一区二区三区在线| 亚洲一区欧美一区| 色综合天天综合色综合av| 久久久精品日韩欧美| 精品制服美女丁香| 欧美一区二区大片| 日韩福利电影在线观看| 欧美日韩一区二区欧美激情| 亚洲视频一区在线观看| 波多野结衣亚洲| 国产精品嫩草影院av蜜臀| 国产东北露脸精品视频| 日韩欧美国产1| 免费观看日韩av| 91精品国产色综合久久不卡蜜臀 | 欧美一二三区在线| 亚洲成人精品一区| 欧美日韩国产精选| 亚欧色一区w666天堂| 欧美精品 日韩| 日本在线观看不卡视频| 欧美一区三区四区| 国内成人免费视频| 国产欧美日韩精品在线| 99久久国产综合精品麻豆| 亚洲图片你懂的| 在线一区二区三区四区| 婷婷中文字幕一区三区| 日韩一区二区在线观看视频播放| 蜜桃视频免费观看一区| 欧美一级黄色大片| 国产一区二区三区四| 久久免费的精品国产v∧| 成人精品视频一区二区三区尤物| 国产精品电影一区二区| 欧美婷婷六月丁香综合色| 午夜av区久久| 久久先锋影音av鲁色资源网| yourporn久久国产精品| 亚洲小说春色综合另类电影| 日韩一区二区在线看片| 国产酒店精品激情| 136国产福利精品导航| 欧美三级乱人伦电影| 久久超碰97人人做人人爱| 欧美国产日韩在线观看| 欧美亚洲禁片免费| 激情五月婷婷综合网| 一区精品在线播放| 91精品国产91热久久久做人人| 国产成人av在线影院| 亚洲精品高清视频在线观看| 欧美一区二区视频在线观看2022| 国产成人丝袜美腿| 亚洲国产精品久久人人爱| 久久影院视频免费| 色婷婷一区二区三区四区| 麻豆国产91在线播放| 亚洲精品一二三区| 精品福利av导航| 欧美体内she精视频| 国产精华液一区二区三区| 亚洲一区自拍偷拍| 国产精品天美传媒沈樵| 欧美一级xxx| 色婷婷综合久久久久中文一区二区 | 最新国产の精品合集bt伙计| 5566中文字幕一区二区电影| av色综合久久天堂av综合| 免费高清成人在线| 一区二区日韩av| 中文字幕欧美国产| 欧美成人综合网站| 欧美色涩在线第一页| 95精品视频在线| 国产一区二区三区在线观看精品| 亚洲国产毛片aaaaa无费看| 国产婷婷色一区二区三区四区| 91美女视频网站| 成人午夜私人影院| 久久国产精品72免费观看| 亚洲一区二区成人在线观看| 国产精品久久久久桃色tv| 久久久综合九色合综国产精品| 5566中文字幕一区二区电影| 色婷婷久久久亚洲一区二区三区| 国产v日产∨综合v精品视频| 韩国女主播一区二区三区| 日韩精彩视频在线观看| 亚洲国产精品自拍| 亚洲主播在线播放| 亚洲一区免费观看| 亚洲尤物在线视频观看| 一区二区三区丝袜| 一区二区三区在线视频播放| 国产精品超碰97尤物18| 日韩理论片网站| 亚洲色大成网站www久久九九| 国产精品家庭影院| 亚洲同性gay激情无套| 国产精品国产a| 亚洲女同ⅹxx女同tv| 亚洲欧美色图小说| 亚洲精品国产高清久久伦理二区| 亚洲免费观看高清在线观看| 亚洲欧美一区二区三区极速播放 | 日韩一区二区在线看| 欧美mv和日韩mv国产网站| 欧美岛国在线观看| 亚洲精品一区二区精华| 久久久三级国产网站| 中文字幕免费观看一区| 亚洲欧美偷拍另类a∨色屁股| 玉米视频成人免费看| 亚洲高清三级视频| 日韩精品亚洲专区| 精品一区二区三区在线播放视频| 国产裸体歌舞团一区二区| 国产一区二区三区免费播放| 国产成人免费视频网站高清观看视频 | 国产成人激情av| 日本韩国一区二区三区| 欧美精品在线观看播放| 精品对白一区国产伦| 国产精品视频你懂的| 亚洲伊人伊色伊影伊综合网| 裸体歌舞表演一区二区| 丁香桃色午夜亚洲一区二区三区| 91猫先生在线| 欧美一区二区三区电影| 日本一区二区三区在线观看| 悠悠色在线精品| 久久99国产精品免费网站| 不卡av在线免费观看| 欧美日韩在线免费视频| 久久久精品国产免大香伊| 一区二区欧美视频| 国产综合久久久久影院| 91视频在线观看| 日韩欧美中文一区二区| 成人欧美一区二区三区视频网页| 天天色 色综合| 从欧美一区二区三区| 欧美日韩亚洲综合一区二区三区 | 亚洲三级久久久| 经典三级一区二区| 色综合久久中文综合久久97| 欧美成人精品3d动漫h| 亚洲三级理论片| 国产一区二区三区四区五区美女 | 一二三四社区欧美黄| 国产精品一区二区久久不卡| 欧美优质美女网站| 国产日韩欧美高清在线| 日本亚洲欧美天堂免费| 91视频com| 欧美极品aⅴ影院| 老汉av免费一区二区三区| 在线一区二区三区四区五区| 国产三级精品视频| 青青草97国产精品免费观看| 一本一道久久a久久精品| 久久精品视频免费| 美国十次综合导航| 欧美日韩亚洲综合一区二区三区| 亚洲欧洲在线观看av| 国产成人精品aa毛片| 精品对白一区国产伦| 日本视频一区二区三区| 欧美人与z0zoxxxx视频| 亚洲精品国产无天堂网2021| 成人免费av在线| 欧美激情一区二区三区全黄 | 亚洲成精国产精品女| 91免费看片在线观看| 国产精品蜜臀在线观看| 国产成a人亚洲精品| 亚洲精品在线免费播放| 美日韩一区二区| 日韩西西人体444www| 天天av天天翘天天综合网色鬼国产| 日本久久电影网| 亚洲一区二区美女| 在线观看国产日韩| 亚洲成人免费视频|