Exemplo n.º 1
0
        public void setAddr(int addr, int pos)
        {
            record temp = table[pos];

            temp.address = addr;
            table[pos]   = temp;
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        /*向符号表中添加一条记录*/
        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);
        }
Exemplo n.º 4
0
        //添加到符号表中
        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);
            }
        }
Exemplo n.º 5
0
        //<因子> ::= <标识符>|<无符号整数>|'('<表达式>')'
        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);
            }
        }