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

📄 middlecode.java

📁 一个小的编译器,可以模仿类似c语言的语法。很适合初级java学习者
💻 JAVA
字号:
class MiddleCode
{
	//////////////////////////
	
	int line;
	int middleItem;
	
	String matchStack[];
	int matchStackPointer;
	
	String operatorStack[];
	int operatorStackPointer;
	
	String matchQueue[];
	public static int matchQueueHead;
	public static int matchQueueTail;
	
	String first;
	String second;
	String third;
	String forth;
	
	String defineType;
	String defineName;
	
	
	public MiddleCode()
	{
		/////////////////
		matchStack = new String[100];
		operatorStack = new String[100];
		matchQueue = new String[100];
		
		first = new String();
		second = new String();
		third = new String();
		forth = new String();
		
		defineType = new String();
		defineName = new String();
		
	}
	
	
	
	
	public void resetFour()
	{
		first = "_";
		second = "_";
		third = "_";
		forth = "_";
	}
	
	
	//////////////////////////////////////////////////////////////////////////////////////
	public void outPutFour()
	{
		MiddleCodeFrame.textArea.append("          Line "+String.valueOf(line)+" :");
		line++;
		MiddleCodeFrame.textArea.append("("+first+","+second+","+third+","+forth+")"+String.valueOf('\n'));
		resetFour();
	}
	
	
	////////////////////////////////////////////////////////////////
	
	public void init()
	{
		line = 1;
		
		matchStackPointer=0;
		operatorStackPointer = 0;
		
		matchQueueHead = 0;
		matchQueueTail = 0;
		
		/////////////////////////////////////
		MiddleCodeFrame.textArea.setText("                           MIDDLE CODE"+String.valueOf('\n'));
		WordAnalyze.wordPointer=0;
		
		resetFour();
		
		middleItem = 0;
	
	}
	
	/////the operation of matchStack//////////////////
	public void pushIntoStack(String s)
	{
		matchStack[matchStackPointer]=s;
		matchStackPointer++;
		
	}
	public String popOutStack()
	{
		
		if(!stackIsEmpty())
		{
			matchStackPointer--;
			return (matchStack[matchStackPointer]);
		}
		else
		{
			return "error";
		}
	
	}
	
	public String getTopStack()
	{
		if(!stackIsEmpty())
		{
			return matchStack[matchStackPointer-1];

		}
		else
		{
			return "null";
		}
	}
	
	public void clearStack()
	{
		matchStackPointer=0;
	}
	
	public boolean stackIsEmpty()
	{
		boolean flag = true;
		if(matchStackPointer==0)
		{
			flag=true;
		}
		else
		{
			flag=false;
		}
		return flag;
	}
	
	public void showStack()
	{
		CompileFrame.errorArea.append("The stack's content is :"+String.valueOf('\n'));
		int i = matchStackPointer;
		while(i>=1)
		{
			CompileFrame.errorArea.append(""+matchStack[i-1]);
			i--;
			
		}
			
	}
	//////////////////////////////////////////////
	public void pushIntoOperatorStack(String s)
	{
		operatorStack[operatorStackPointer++]=s;
	}
	
	public String popOutOperatorStack()
	{
		operatorStackPointer--;
		if(operatorStackPointer>=0)
		{
			return operatorStack[operatorStackPointer];
		}
		else
		{
			return "error";
		}
		
	}
	public String getTopOperatorStack()
	{
		if(operatorStackPointer>0)
		{
			return operatorStack[operatorStackPointer-1];
		}
		else
		{
			return "error";
		}
	}
	public boolean operatorStackIsEmpty()
	{
		if(operatorStackPointer==0)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	
	public void clearOperatorStack()
	{
		operatorStackPointer=0;
	}
	
	////////operation of queue//////
	public void pushIntoQueue(String s)
	{
		matchQueue[matchQueueTail++]=s;
	}
	public String popOutQueue()
	{
		return matchQueue[matchQueueHead++];
	}
	public void clearQueue()
	{
		matchQueueHead = matchQueueTail =0;
	}
	public boolean queueIsEmpty()
	{
		boolean flag = true;
		if(matchQueueHead == matchQueueTail)
		{
			flag = true;
		}
		else
		{
			flag = false;
		}
		return flag;
	}
	public String getHeadQueue()
	{
		if(!queueIsEmpty())
		{
			return matchQueue[matchQueueHead];
		}
		else
		{
			return "null";
		}
	}
	public void showQueue()
	{
		CompileFrame.errorArea.append("The queue's content is:"+String.valueOf('\n'));
		int i=matchQueueHead;
		while(i<matchQueueTail)
		{
			CompileFrame.errorArea.append(""+matchQueue[i]+String.valueOf('\n'));
			i++;
		}
		
	} 
	///////////////////////////////////////
	
	public boolean judgeType(String s)
	{
		boolean flag=false;		
		if(s.equals("int")||s.equals("double")
			||s.equals("float")||s.equals("char"))
		{
			flag = true;
		}
		else 
		{
			flag = false;
		}
		return flag;
	}
	
	public boolean expressOperatorSign(String s)
	{
		if(s.equals("+")||s.equals("-")||s.equals("*")||s.equals("%")
			||s.equals("/")||s.equals("=")||s.equals("(")||s.equals(")"))
			{
				return true;
			}
			else
			{
				return false;
			}
	}
	//////////////////////////////////////
	
	public void advance()
	{
		WordAnalyze.wordPointer++;
	}
	
	
	////////////////the operator's level///////////
	public int operatorLevel(String s,String t)
	{
		
		/*
		 *	0 equel
		 *  1 greater
		 *  2 less
		 *  3 nonsense
		 *	-1 )
		 *	-2 (
		 *	-3	=
		 *	-4	error
		 */
		 
		 if(s.equals("="))
		 {
		 	return 1;
		 }
		 else
		 if(s.equals(")"))
		 {
		 	
		 	return (-1);
		 }
		 else
		 if(s.equals("+")||s.equals("-"))
		 {
		 	if(t.equals("*")||t.equals("%")||t.equals("/")
		 		||t.equals("("))
		 		{
		 			return 1;
		 		}
		 		else
		 		{
		 			return 2;
		 		}
		 }
		 else
		 if(s.equals("*")||s.equals("/")||s.equals("%"))
		 {
		 	if(t.equals("("))
		 	{
		 		return 1;
		 	}
		 	else
		 	{
		 		return 2;
		 	}
		 }
		 if(s.equals("("))
		 {
		 	if(t.equals("("))
		 	{
		 		return 1;
		 	}
		 	else
		 	if(t.equals(")"))
		 	{
		 		return 0;
		 	}
		 	else
		 	{
		 		return 1;
		 	}
		 }
		 else
		 {
		 	return (-4);
		 }
		
	}
	
	public boolean judgeSymbol(String s)
	{
		boolean flag =false;
		char wordBuffer[]=s.toCharArray();
		int length = s.length();
		
		if(s.equals("int")||s.equals("float")||s.equals("double")
		||s.equals("char")||s.equals("if")||s.equals("while")||s.equals("for")
		||s.equals("include")||s.equals("main")||s.equals("printf")||s.equals("scanf"))
		{
			flag = false;
			////////////////////
			
		}
		else
		if((wordBuffer[0]>='a'&&wordBuffer[0]<='z')||(wordBuffer[0]>='A'&&wordBuffer[0]<='Z'))
		{
			flag=true;
			for(int i=1;i<length&&flag;i++)
			{
				if((wordBuffer[i]>='a'&&wordBuffer[i]<='z')||(wordBuffer[i]>='A'&&wordBuffer[i]<='Z')||(wordBuffer[i]=='_'))
				{
					
				}	
				else
				{
					flag = false;
				}			
			}	
		}
		else
		{
			flag = false;
		}
		
		return flag;
	}
	
	/////////////express middle/////////////////////
	public void expressMiddleCode()
	{
		
		if(WordAnalyze.wordString[WordAnalyze.wordPointer+1].equals("++")
		||WordAnalyze.wordString[WordAnalyze.wordPointer+1].equals("--"))
		{
			pushIntoStack(WordAnalyze.wordString[WordAnalyze.wordPointer]);
			pushIntoOperatorStack("=");
			pushIntoStack(WordAnalyze.wordString[WordAnalyze.wordPointer]);
			advance();
			if(WordAnalyze.wordString[WordAnalyze.wordPointer].equals("++"))
			{
				pushIntoStack("1");
				pushIntoOperatorStack("+");
			}
			else
			{
				pushIntoStack("1");
				pushIntoOperatorStack("-");
			}
			advance();
			
		}
		else
		{
			while(!(WordAnalyze.wordString[WordAnalyze.wordPointer].equals(";")||WordAnalyze.wordString[WordAnalyze.wordPointer].equals(",")))
			{
				expressCodeA();
			
			}
			advance();
		}
		
		if(!stackIsEmpty()||!operatorStackIsEmpty())
		{
			workOutB();
		}
	}
	public void expressCodeA()
	{
	
		if(expressOperatorSign(WordAnalyze.wordString[WordAnalyze.wordPointer]))
		{
			
			if(operatorStackPointer==0)
			{
				pushIntoOperatorStack(WordAnalyze.wordString[WordAnalyze.wordPointer]);
				advance();
			
			}
			else
			{
				String t;
				t = getTopOperatorStack();
				if(operatorLevel(t,WordAnalyze.wordString[WordAnalyze.wordPointer])==0)
				{
					t=popOutOperatorStack();
					advance();
			
				}
				else
				if(operatorLevel(t,WordAnalyze.wordString[WordAnalyze.wordPointer])==1)
				{
					pushIntoOperatorStack(WordAnalyze.wordString[WordAnalyze.wordPointer]);
					advance();
		
				}
				else
				if(operatorLevel(t,WordAnalyze.wordString[WordAnalyze.wordPointer])==2)
				{
					workOutA();
				}
			}
		}
		else
		{
			if(WordAnalyze.wordString[WordAnalyze.wordPointer].equals("'"))
			{
				String s = WordAnalyze.wordString[WordAnalyze.wordPointer];
				advance();
				s += WordAnalyze.wordString[WordAnalyze.wordPointer];
				advance();
				s+=WordAnalyze.wordString[WordAnalyze.wordPointer];
				
				pushIntoStack(s);
				advance();
			}
			else
			{
				pushIntoStack(WordAnalyze.wordString[WordAnalyze.wordPointer]);
				advance();
			}
			
		}
		
	}

	public void workOutA()
	{
		third = popOutOperatorStack();
		forth = popOutStack();
		second = popOutStack();
		
		first = "t"+String.valueOf(middleItem++);
		pushIntoStack(first);
		
		
		outPutFour();
				
	}
	
	public void workOutB()
	{
		while(!stackIsEmpty()||!operatorStackIsEmpty())
		{
			if(getTopOperatorStack().equals("="))
			{
				third = popOutStack();
				second = popOutOperatorStack();
				first = popOutStack(); 
				
				outPutFour();
			}
			else
			{
				forth = popOutStack();
				third = popOutOperatorStack();
				second = popOutStack();
				first = "t"+String.valueOf(middleItem++);
				pushIntoStack(first);
				
				outPutFour();
				
			}
		}
		
	}
	
	
	
	///////////////////include file/////////////////
	public void includeFile()
	{
		while(WordAnalyze.wordString[WordAnalyze.wordPointer].equals("#"))
		{
			includeMiddleCode();
		}
	}
	public void includeMiddleCode()
	{
		first = "include";
		while(!WordAnalyze.wordString[WordAnalyze.wordPointer].equals("\"")
				&&!WordAnalyze.wordString[WordAnalyze.wordPointer].equals("<"))
		{
			advance();  
		}
		
		advance();
		second = WordAnalyze.wordString[WordAnalyze.wordPointer];
		advance();
		second +=WordAnalyze.wordString[WordAnalyze.wordPointer];
		advance();
		second +=WordAnalyze.wordString[WordAnalyze.wordPointer];
		
		
		advance();
		advance();
		
		outPutFour();
		
	}
	
	////////////define ////////////////////////
	public void defineMiddleCode()
	{
		while(judgeType(WordAnalyze.wordString[WordAnalyze.wordPointer]))
		{
			defineCodeA();
		}
		
	}
	public void defineCodeA()
	{
		if(judgeType(WordAnalyze.wordString[WordAnalyze.wordPointer]))
		{
			defineType = WordAnalyze.wordString[WordAnalyze.wordPointer];
			advance();
		}
		
		while(!WordAnalyze.wordString[WordAnalyze.wordPointer].equals(";"))
		{
			defineCodeB();
		}
		advance();
	}
	public void defineCodeB()
	{
		if(judgeSymbol(WordAnalyze.wordString[WordAnalyze.wordPointer]))
		{
			defineName = WordAnalyze.wordString[WordAnalyze.wordPointer];
			first = defineType;
			second = defineName;
			outPutFour();
			advance();
			if(WordAnalyze.wordString[WordAnalyze.wordPointer].equals("="))
			{
				pushIntoStack(defineName);
				expressMiddleCode();
								
			}
						 
		}
		else
		if(WordAnalyze.wordString[WordAnalyze.wordPointer].equals(","))
		{
			advance();
			
		}
	}
	
	//////////evaluate//////////////////////
	public void evaluateMiddleCode()
	{
		if(judgeSymbol(WordAnalyze.wordString[WordAnalyze.wordPointer]))
		{
			
			evaluateCodeA();
		}
	}
	public void evaluateCodeA()
	{
		expressMiddleCode();
	}
	
	/////////////////main program////////////////////
	public void mainMiddleCode()
	{
		while(!WordAnalyze.wordString[WordAnalyze.wordPointer].equals("main"))
		{
			advance();
		}
		first = "StartOfProgram";
		second = "main";
		outPutFour();
		
		
		middleCodeAnalyze();
	
		advance();
		first = "EndOfProgram";
		second = "main";
		outPutFour();
	}
	////////////scanf/////////////////////////////////////
	
	public void scanfMiddleCode()
	{
		while(!WordAnalyze.wordString[WordAnalyze.wordPointer].equals("\""))
		{
			advance();
		}
		advance();
		while(!WordAnalyze.wordString[WordAnalyze.wordPointer].equals("\""))
		{
			advance();
		}
		advance();
		while(!WordAnalyze.wordString[WordAnalyze.wordPointer].equals(")"))
		{
			advance();
			advance();
			first = "cin";
			second = WordAnalyze.wordString[WordAnalyze.wordPointer];
			outPutFour();
			advance();
		}
	}
	/////////////////printf/////////////////
	public void printfMiddleCode()
	{
		while(!WordAnalyze.wordString[WordAnalyze.wordPointer].equals("\""))
		{
			advance();
		}
		advance();
		while(!WordAnalyze.wordString[WordAnalyze.wordPointer].equals("\""))
		{
			advance();
		}
		advance();
		
		
		while(!WordAnalyze.wordString[WordAnalyze.wordPointer].equals(")"))
		{
		
			advance();
			first = "cout";
			second = WordAnalyze.wordString[WordAnalyze.wordPointer];
			
			outPutFour();
			advance();
			
		}
		
		
	}
	
	
	////////////////////////////////////////////////////////////////////
	
	public void middleCodeAnalyze()
	{
		while(!WordAnalyze.wordString[WordAnalyze.wordPointer].equals("{"))
		{
			advance();
		}
		advance();
		defineMiddleCode();
		while(WordAnalyze.wordPointer<WordAnalyze.wordStringLength-1)
		{
			
			if(WordAnalyze.wordString[WordAnalyze.wordPointer].equals("scanf"))
			{
				scanfMiddleCode();
			}
			else
			if(WordAnalyze.wordString[WordAnalyze.wordPointer].equals("printf"))
			{
				printfMiddleCode();
			}
			else
			if(judgeSymbol(WordAnalyze.wordString[WordAnalyze.wordPointer]))
			{
				evaluateMiddleCode();
			}
			else
			{
				advance();
			}

			
		}
	}
	
	public void middleCodeCreate()
	{
		init();
		includeFile();
		mainMiddleCode();	
		
		
	}
}

⌨️ 快捷键说明

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