📄 glb.java
字号:
import java.util.*;
//这里定义了所有的全局变量
public class Glb
{
public static int LEV=-1;
public static int DX=0;
public static int err_line=0;
public static int word_start=0,word_end=0;
public static boolean readytoRun=false;
//标志词法分析中发现的错误
public static WordInfo word_err=new WordInfo("word_err",WordType.WORDERROR,-1,-1,-1);
//标志逆波兰转换中发生的错误
public static Vector nbl_err=new Vector();
//标志符表
public static Vector Table=new Vector();
//目标码序列
public static Vector ObjCode=new Vector();
//堆栈---未确定的子程序入口(table表中地址回填时用)
public static IntStack S_Unconfirm_proc_start=new IntStack();
//堆栈---未确定的JPC语句地址(目标代码中地址回填时用)
public static IntStack S_Unconfirm_JPC=new IntStack();
//堆栈---未确定的while-do语句的回跳地址
public static IntStack S_Unconfirm_do=new IntStack();
//所有标志符总共需要的空间(有疑问)
public static int space_needed;
//table表的索引
public static int index_table;
//堆栈---(语法分析中)已经定义的父过程
public static Stack S_Fathers=new Stack();
//目标码序列的索引
public static int index_code;
public static void reset()
{
LEV=-1;
DX=0;
err_line=0;
word_start=0;
word_end=0;
readytoRun=false;
Table.removeAllElements();
ObjCode.removeAllElements();
ObjCode.addElement(new Injunction());
ObjCode.addElement(new Injunction());
S_Unconfirm_proc_start.removeall();
S_Unconfirm_JPC.removeall();
S_Unconfirm_do.removeall();
S_Fathers.removeAllElements();
space_needed=0;
index_table=0;
index_code=0;
}
//判断新声明的标志符是不是和已有的标志符重名
public static boolean ID_samename(WordInfo w)
{
WordInfo fromtable;
int length=Glb.S_Fathers.size();
IntStack area;
for(int i=0;i<length;i++)
{
area=((IntStack)Glb.S_Fathers.elementAt(i));
int area_length=area.size();
if(area_length==0)
continue;
for(int j=0;j<area_length;j++)
{
fromtable=(WordInfo)Table.elementAt(area.elementAt(j));
if(fromtable.name.equals(w.name))
return true;
}
}
return false;
}
//判断一个标志符是不是已经声明了,且只能是var或const(右值表达式中用)
public static boolean ID_defined(WordInfo w)
{
WordInfo fromtable;
int length=Glb.S_Fathers.size();
IntStack area;
for(int i=0;i<length;i++)
{
area=((IntStack)Glb.S_Fathers.elementAt(i));
int area_length=area.size();
if(area_length==0)
continue;
for(int j=0;j<area_length;j++)
{
fromtable=(WordInfo)Table.elementAt(area.elementAt(j));
if(fromtable.name.equals(w.name)&&(fromtable.type==WordType.VAEIABLE||fromtable.type==WordType.CONSTANT))
return true;
}
}
return false;
}
//判断一个标志符是不是可以被赋值,既一个标志符是不是一个变量(左值表达式中用)
public static boolean is_var(WordInfo w)
{
WordInfo fromtable;
int length=Glb.S_Fathers.size();
IntStack area;
for(int i=0;i<length;i++)
{
area=((IntStack)Glb.S_Fathers.elementAt(i));
int area_length=area.size();
if(area_length==0)
continue;
for(int j=0;j<area_length;j++)
{
fromtable=(WordInfo)Table.elementAt(area.elementAt(j));
if(fromtable.name.equals(w.name)&&fromtable.type==WordType.VAEIABLE)
return true;
}
}
return false;
}
public static boolean can_in_mathexp(WordInfo w)
{
if(w.type==WordType.NUM)
return true;
if(w.name.equals("+")||w.name.equals("-")||w.name.equals("*")||w.name.equals("/")||w.name.equals("(")||w.name.equals(")"))
return true;
if(ID_defined(w))
return true;
return false;
}
public static WordInfo word_in_table(WordInfo w)
{
WordInfo fromtable=new WordInfo();
int length=Glb.S_Fathers.size();
IntStack area;
out: for(int i=0;i<length;i++)
{
area=((IntStack)Glb.S_Fathers.elementAt(i));
int area_length=area.size();
if(area_length==0)
continue;
for(int j=0;j<area_length;j++)
{
fromtable=(WordInfo)Table.elementAt(area.elementAt(j));
if(fromtable.name.equals(w.name))
break out;
}
}
return fromtable;
}
public static boolean is_a_rla_op(WordInfo w)
{
if(w.name.equals("="))
return true;
if(w.name.equals(">"))
return true;
if(w.name.equals(">="))
return true;
if(w.name.equals("<"))
return true;
if(w.name.equals("<="))
return true;
if(w.name.equals("#"))
return true;
return false;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -