📄 env.java
字号:
package Semant;class Env { Symbol.Table venv; // ambiente dei valori Symbol.Table tenv; // ambiente dei tipi ErrorMsg.ErrorMsg errorMsg; Types.INT inttemp; Types.STRING stringtemp; public Translate.Level lev; /* costruttore */ public Env(ErrorMsg.ErrorMsg err,Translate.Level l) { errorMsg=err; lev=l; // creazione tabelle dei simboli tenv = new Symbol.Table(); venv = new Symbol.Table(); inttemp=new Types.INT(); stringtemp=new Types.STRING(); // inserimento dei tipi base in tenv (tabella dei tipi) tenv.put(Symbol.Symbol.symbol("int"),inttemp); tenv.put(Symbol.Symbol.symbol("string"),stringtemp); // inserimento delle funzioni base in venv (tabella dei valori) // creazione delle label Temp.Label printLabel = new Temp.Label("print"); Temp.Label exitLabel = new Temp.Label("exit"); Temp.Label flushLabel = new Temp.Label("flush"); Temp.Label getcharLabel = new Temp.Label("getchar"); Temp.Label ordLabel = new Temp.Label("ord"); Temp.Label chrLabel = new Temp.Label("chr"); Temp.Label sizeLabel = new Temp.Label("size"); Temp.Label substringLabel = new Temp.Label("substring"); Temp.Label concatLabel = new Temp.Label("concat"); Temp.Label notLabel = new Temp.Label("not"); // print(s: string) venv.put( Symbol.Symbol.symbol("print"), new FunEntry( new Translate.Level(lev,Symbol.Symbol.symbol(printLabel.toString()),new Util.BoolList(false, null)), printLabel, new Types.RECORD(Symbol.Symbol.symbol("s"), stringtemp, null), null)); // flush() venv.put( Symbol.Symbol.symbol("flush"), new FunEntry( new Translate.Level(lev,Symbol.Symbol.symbol(flushLabel.toString()),null), flushLabel, null, null)); // getchar() : string venv.put( Symbol.Symbol.symbol("getchar"), new FunEntry( new Translate.Level(lev,Symbol.Symbol.symbol(getcharLabel.toString()),null), getcharLabel, null, stringtemp)); // ord(s: string) : int venv.put( Symbol.Symbol.symbol("ord"), new FunEntry( new Translate.Level(lev,Symbol.Symbol.symbol(ordLabel.toString()),null), ordLabel, new Types.RECORD(Symbol.Symbol.symbol("s"), stringtemp, null), inttemp)); // chr(i: int) : string venv.put( Symbol.Symbol.symbol("chr"), new FunEntry( new Translate.Level(lev,Symbol.Symbol.symbol(chrLabel.toString()),new Util.BoolList(false, null)), chrLabel, new Types.RECORD(Symbol.Symbol.symbol("i"), inttemp, null), stringtemp)); // size(s: string) : int venv.put( Symbol.Symbol.symbol("size"), new FunEntry( new Translate.Level(lev, Symbol.Symbol.symbol(sizeLabel.toString()),new Util.BoolList(false,null)), sizeLabel, new Types.RECORD(Symbol.Symbol.symbol("s"), stringtemp, null), inttemp)); // substring(s:string, first:int, n:int): string venv.put( Symbol.Symbol.symbol("substring"), new FunEntry( new Translate.Level( lev, Symbol.Symbol.symbol(substringLabel.toString()), new Util.BoolList(false, new Util.BoolList(false, new Util.BoolList(false,null)))), substringLabel, new Types.RECORD( Symbol.Symbol.symbol("s"), stringtemp, new Types.RECORD( Symbol.Symbol.symbol("first"), inttemp, new Types.RECORD(Symbol.Symbol.symbol("n"), inttemp, null))), stringtemp)); // concat(s1: string, s2: string): string venv.put( Symbol.Symbol.symbol("concat"), new FunEntry( new Translate.Level( lev, Symbol.Symbol.symbol(concatLabel.toString()), new Util.BoolList(false, new Util.BoolList(false,null))), concatLabel, new Types.RECORD( Symbol.Symbol.symbol("s1"), stringtemp, new Types.RECORD(Symbol.Symbol.symbol("s2"), stringtemp, null)), stringtemp)); // not(i: int) : int venv.put(Symbol.Symbol.symbol("not"), new FunEntry(new Translate.Level(lev, Symbol.Symbol.symbol(notLabel.toString()), new Util.BoolList(false,null)), notLabel, new Types.RECORD(Symbol.Symbol.symbol("i"), inttemp, null), inttemp)); // exit(i: int) venv.put(Symbol.Symbol.symbol("exit"), new FunEntry(new Translate.Level(lev, Symbol.Symbol.symbol(exitLabel.toString()), new Util.BoolList(false,null)), exitLabel, new Types.RECORD(Symbol.Symbol.symbol("i"), inttemp, null), null)); // INSERIMENTO NELLA HASHTABLE DELLE ROUTINE DI LIBRERIA (o esterne) // routine esterne usate in Translate... Temp.Label initArrayLabel = new Temp.Label("initArray"); Temp.Label allocRecordLabel = new Temp.Label("allocRecord"); Temp.Label stringEqualLabel = new Temp.Label("stringEqual"); // aggiunge la coppia (string, label) nella hashtable (lev.frame).put_lib_f("print", printLabel); (lev.frame).put_lib_f("exit", exitLabel); (lev.frame).put_lib_f("flush", flushLabel); (lev.frame).put_lib_f("getchar", getcharLabel); (lev.frame).put_lib_f("ord", ordLabel); (lev.frame).put_lib_f("chr", chrLabel); (lev.frame).put_lib_f("size", sizeLabel); (lev.frame).put_lib_f("substring", substringLabel); (lev.frame).put_lib_f("concat", concatLabel); (lev.frame).put_lib_f("not", notLabel); (lev.frame).put_lib_f("initArray", initArrayLabel ); (lev.frame).put_lib_f("allocRecord", allocRecordLabel); (lev.frame).put_lib_f("stringEqual", stringEqualLabel); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -