public void setAddr(int addr, int pos) { record temp = table[pos]; temp.address = addr; table[pos] = temp; }
public int[] dx = new int[4]; //层次入口数组 public symbol_table(Compiler C) { compiler = C; point = 0; dx[0] = 0; record stentry = new record(); stentry.name = ""; stable.Add(stentry); }
/*向符号表中添加一条记录*/ public void tableFill(String name, int type, int value, int level, int dx) { tablePtr++; record rec = new record(); rec.name = name; rec.type = type; rec.value = value; rec.level = level; rec.address = dx; table.Add(rec); }
//添加到符号表中 public void add(symlist sym) { syntax_Analysis sa = compiler.sa; if (sa.level > point) { point++; dx[point] = dx[point - 1]; } else if (sa.level < point) { //int delnum = dx[point] - dx[point - 1]; //for (int i = 0; i < delnum; i++) // stable.RemoveAt(stable.Count - 1); //point--; } dx[point]++; record re = new record(); re.name = compiler.la.word; if (sym == symlist.constsym) { re.kind = "constant"; re.val = compiler.la.num; stable.Add(re); } else if (sym == symlist.varsym) { re.kind = "variable"; re.level = sa.level; //获取地址还没写re.adr = re.adr = compiler.sa.getadd(); stable.Add(re); } else if (sym == symlist.proceduresym) { re.kind = "procedure"; re.level = sa.level; stable.Add(re); } }
//<因子> ::= <标识符>|<无符号整数>|'('<表达式>')' public void factor(List <symlist> followlst) { Pcode pc = compiler.pc; List <symlist> nextlst = new List <symlist>(); symbol_table st = compiler.st; lexical_analysis la = compiler.la; Error er = compiler.error; int index; nextlst.AddRange(factorSymSet); check(nextlst, followlst, 24); while (factorSymSet.Contains(sym)) { if (sym == symlist.iden) { index = st.position(la.word); if (index == -1) { er.adderror(11); } else { record re = st.stable[index]; string kind = re.kind; if (kind == "constant") { pc.gen("LIT", 0, re.val); } else if (kind == "variable") { int l = level - re.level; int a = re.adr; pc.gen("LOD", l, a); } else { er.adderror(21); } } getsym(); } else if (sym == symlist.number) { pc.gen("LIT", 0, la.num); getsym(); } else if (sym == symlist.LParenthesis) { getsym(); followlst.Add(symlist.RParenthesis); expression(followlst); if (sym == symlist.RParenthesis) { getsym(); } else { er.adderror(22); } //error } check(followlst, factorSymSet, 23); } }