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

📄 glb.java

📁 用java写的一段PL0编译程序.用户可以在文本框内输入一段PL0代码
💻 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 + -