📄 blocknode.java
字号:
class BlockNode extends ExecutableNode
{
static boolean vReturn= false;
StatementNode[] vStatementNodes;
int vBlockCount;
int vBlockSize;
Environment vSuperEnvironment;
Environment vEnvironment;
static BlockNode parserBlock(Environment env,Scanner s) throws ParserException, ScannerException
{
BlockNode tmpBlockNode= new BlockNode();
matchBracket(s,'{');
if(!isBracketToken(s,'}'))
{
tmpBlockNode.mPushStatementNode(StatementNode.parserStatement(env,s));
while(!isBracketToken(s,'}'))
tmpBlockNode.mPushStatementNode(StatementNode.parserStatement(env,s));
}
matchBracket(s,'}');
if(tmpBlockNode.vBlockCount!=0)return tmpBlockNode;
else return null;
}
static boolean mIsBlock(Scanner s) throws ScannerException
{
Token t=s.token();
if(t.isBracket())return ((BracketToken)t).isOpenBlock();
else return false;
}
boolean mEmptyBlockBuf()
{
return vBlockCount==0;
}
boolean mFullBlockBuf()
{
return vBlockCount==vBlockSize;
}
void mPushStatementNode(StatementNode aStatementNode)
{
if(mFullBlockBuf())mAutoResizeBlockBuf();
vStatementNodes[vBlockCount]= aStatementNode;
vBlockCount++;
}
StatementNode mPopStatementNode()
{
if(!mEmptyBlockBuf())
{
vBlockCount--;
return vStatementNodes[vBlockCount];
}else return null;
}
void mResizeBlockBuf(int aNewBlockSize)
{
if(aNewBlockSize > vBlockCount)
{
StatementNode[] tmpStatementNodes;
tmpStatementNodes= new StatementNode[aNewBlockSize];
for(int i=0; i<vBlockCount; i++)
tmpStatementNodes[i]= vStatementNodes[i];
vBlockSize= aNewBlockSize;
vStatementNodes= tmpStatementNodes;
}
}
void mAutoResizeBlockBuf()
{
mResizeBlockBuf(vBlockSize*2);
}
BlockNode()
{
vBlockCount= 0;
vBlockSize= 4;
vStatementNodes= new StatementNode[vBlockSize];
}
BlockNode(int aBlockSize)
{
vBlockCount= 0;
vBlockSize= aBlockSize;
vStatementNodes= new StatementNode[aBlockSize];
}
String format(int indent)
{
String str="{\n";
for(int i=0; i<vBlockCount; i++)
str+= vStatementNodes[i].format(indent);
str+= "}\n";
return str;
}
Environment run(Environment env) throws InterpreterException
{
int i= 0;
vSuperEnvironment= env;
vEnvironment= vSuperEnvironment.mCreateNewEnvironment();
vReturn= false;
while((i<vBlockCount)&&(!vReturn))
{
vStatementNodes[i].run(vEnvironment);
i++;
}
return vEnvironment;
}
boolean typeCheck(Environment env) throws InterpreterException
{
vSuperEnvironment= env;
vEnvironment= vSuperEnvironment.mCreateNewEnvironment();
for(int i=0; i<vBlockCount; i++)
if(!vStatementNodes[i].typeCheck(vEnvironment))ProgramNode.mTypeCheckError(this.format(4));
ProgramNode.vTopLevelEnvironment.put("returnType","NOTYPE");
return true;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -