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

📄 symboltable.java

📁 c--词法分析
💻 JAVA
字号:
import org.antlr.runtime.*;import org.antlr.runtime.tree.*;import java.util.HashMap;import java.util.Vector;import java.util.Map;public class SymbolTable{	HashMap functions = new HashMap();		Vector scopes ;	Vector frames = new Vector();		HashMap globals = new HashMap();    public void reset_globals(){        globals=new HashMap();        scopes=null;        frames=new Vector();    }    int max_var_num=0;    int max_label_num=0;    public int next_label(){        max_label_num++;        return max_label_num;    }	    public int next_var(){        max_var_num++;        return max_var_num;    }		public void declare_function(String name, String return_type, Vector params, CommonTree pointer){		functions.put(name,new Function(name,return_type, params, pointer));	}		public void enter_block(){		scopes.add(new HashMap());	}		public void exit_block(){		scopes.remove(scopes.size()-1);	}		public void enter_frame(){		scopes=new Vector();		frames.add(scopes);		scopes.add(new HashMap());	}	    public void enter_frame(String name){        enter_frame();        Function fcn=get_function(name);        enter_frame();		for(int i=0;i<fcn.params.size();i++){			FunctionParam p=(FunctionParam)fcn.params.get(i);            if(p.mode=="scalar"){                declare_variable(p.name,p.type,true);            }else{                declare_array(p.name,p.type,1);            }        }    }	public void enter_frame(Function fcn, Vector params){			enter_frame();				for(int i=0;i<fcn.params.size();i++){			FunctionParam p=(FunctionParam)fcn.params.get(i);			if (p.mode=="scalar"){				declare_variable(p.name,p.type,true);				set_value(p.name,(Integer)params.get(i),true);			}else{				reference_variable(p.name,(Variable)params.get(i));			}		}	}		public void exit_frame(){		frames.remove(frames.size()-1);		if (frames.size() > 0){			scopes=(Vector)frames.get(frames.size()-1);		}	}		public Function get_function(String name){		Function fcn=(Function)functions.get(name);		if (fcn==null) {			Main.print_err("No such function: "+name);		}		return fcn;	}		public Variable get_variable(String name){		if(scopes!=null){			for(int i=(scopes.size()-1); i>=0; i--){				Map vars = (Map)scopes.get(i);				Variable v = (Variable)vars.get(name);				if (v != null){					return v;				}			}		}		Variable v = (Variable)globals.get(name);		if (v != null){			return v;		}		Main.print_err("Undeclared variable '"+name+"'");		return null;	}    public void test_declared(String name){        is_declared(name);    }    public void test_assign(String name){        Variable v=get_variable(name);        if(v!=null && v.read_only){            Main.print_err("Attempted to assign a value to the read only variable '"+name+"'");        }    }    public boolean is_declared(String name){        Variable v=get_variable(name);        return v!=null;    }		public int get_value(String name){		Variable v=get_variable(name);		if (v != null){			if ( v.mode.equals("scalar")){				return v.get_value();			}		}		return -1;	}		public int get_value(String name,Integer index){		Variable v=get_variable(name);				if (v != null){			return v.get_value(index);		}				return -1;	}		public void set_value(String name, Integer value,Boolean force){		Variable v=get_variable(name);		if (v != null){            if (force){                v.force_set_value(value);            }else{                v.set_value(value);            }		}	}		public void set_value(String name, Integer value){		Variable v=get_variable(name);		if (v != null){			v.set_value(value);		}	}		public void set_value(String name, Integer value, Integer index){		Variable v=get_variable(name);		if (v != null){			v.set_value(value,index);		}	}	    public void declare_variable(String name,String type){        declare_variable(name,type,false);    }	public void declare_variable(String name,String type, Boolean read_only){		Map vars=get_vars();    	Variable v = (Variable)vars.get(name);    	if ( v!=null ) {      		Main.print_err("Variable '"+name+"' already declared");   		}else{   			vars.put(name,new Variable(name,type,next_var(),read_only));		}	}		private Map get_vars(){		Map vars;		if (scopes==null){			vars=(Map)globals;		}else{			vars =(Map)scopes.get(scopes.size()-1);		}		return vars;	}		public void declare_array(String name,String type,Integer size){		Map vars=get_vars();        max_var_num++;		    	Variable v = (Variable)vars.get(name);    	if ( v!=null ) {      			Main.print_err("Variable '"+name+"' already declared");   		}else{   			vars.put(name,new Variable(name,type,size,max_var_num));		}	}		public void reference_variable(String name,Variable v){		Map vars=get_vars();		v.name=name;		vars.put(name,v);	}}

⌨️ 快捷键说明

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