📄 middlecode.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 + -