Ejemplo n.º 1
0
        //得到数组类型
        private string get_SZtype(string s)
        {
            int        r = ArrayList.IndexOf(s);
            ArrayTable b = (ArrayTable)ArrayTableList[r];

            return(b.Type);
        }
Ejemplo n.º 2
0
        //修改result对应的所在表的value值,为change
        public void retSetValue(string result, string change)
        {
            string a = getValue(result);

            switch (ARG)
            {
            case "VARG":
                int      indexID = VarList.IndexOf(IN_1);
                VarTable BStmp   = (VarTable)VarTableList[indexID];
                BStmp.Value = change;
                break;

            case "TARG":
                int          indexTempID = TempVarList.IndexOf(IN_1);
                TempVarTable LStmp       = (TempVarTable)TempVarTableList[indexTempID];
                LStmp.Value = change;
                break;

            case "SARG":
                if (!Regex.IsMatch(IN_2, pattern))     //如果数组下标为常数
                {
                    int      indexBS1 = VarList.IndexOf(IN_2);
                    VarTable BStmp1   = (VarTable)VarTableList[indexBS1];
                    IN_2 = BStmp1.Value;
                }
                int        indexSZ = ArrayList.IndexOf(IN_1);
                ArrayTable SZtmp   = (ArrayTable)ArrayTableList[indexSZ];
                SZtmp.element[Convert.ToInt32(IN_2)] = change;
                break;

            default:
                break;
            }
        }
Ejemplo n.º 3
0
        //扫描到int或real且后面是变量声明定义的语句
        private void intorreal_stmt()
        {
            string s1; string s2;

            if (nextToken == "int" || nextToken == "real")
            {
                s1        = nextToken;
                nextToken = al.getToken(ref n);
                s2        = nextToken;
                nextToken = al.getToken(ref n);

                if (nextToken == "[")
                {
                    if (!ArrayList.Contains(s2))
                    {
                        nextToken = al.getToken(ref n);
                        int l = Int32.Parse(nextToken);
                        ArrayList.Add(s2);
                        ArrayTable S = new ArrayTable(s2, s1, l);
                        ArrayTableList.Add(S);
                        int d = 0;
                        while (d < l)
                        {
                            S.element.Add(null);
                            d++;
                        }
                        n = n + 2;
                    }
                    nextToken = al.getToken(ref n);
                }
                else
                {
                    if (!VarList.Contains(s2))
                    {
                        VarList.Add(s2);
                        VarTableList.Add(new VarTable(s2, s1));
                    }

                    if (nextToken != ";")
                    {
                        n         = n - 2;
                        nextToken = al.getToken(ref n);
                        assign_stmt();
                    }
                    else
                    {
                        nextToken = al.getToken(ref n);
                    }
                }
            }
        }
Ejemplo n.º 4
0
        //返回result对应的所在表的value值
        public string getValue(string result)
        {
            IN_1 = find_Table_Kind(result);
            switch (ARG)
            {
            case "VARG":     //标识符
                int      indexID = VarList.IndexOf(IN_1);
                VarTable BStmp   = (VarTable)VarTableList[indexID];
                return(BStmp.Value);

            case "TARG":     //临时变量
                int          indexTempID = TempVarList.IndexOf(IN_1);
                TempVarTable LStmp       = (TempVarTable)TempVarTableList[indexTempID];
                return(LStmp.Value);

            case "SARG":                               //数组

                try                                    //如果数组出界,返回一个空值null
                {
                    if (!Regex.IsMatch(IN_2, pattern)) //如果数组下标为常数
                    {
                        int      indexBS1 = VarList.IndexOf(IN_2);
                        VarTable BStmp1   = (VarTable)VarTableList[indexBS1];
                        IN_2 = BStmp1.Value;     //得到数组下标的值
                    }

                    int        indexSZ = ArrayList.IndexOf(IN_1);
                    ArrayTable SZtmp   = (ArrayTable)ArrayTableList[indexSZ];
                    if (Convert.ToInt32(IN_2) > Convert.ToInt32(SZtmp.Length) - 1)
                    {
                        return("OutSide");    //数组越界
                    }
                    return(Convert.ToString(SZtmp.element[Convert.ToInt32(IN_2)]));
                }
                catch (ArgumentNullException)
                {
                    return(null);    //如果返回的为空值
                }

            default:
                return(ARG);    //如果为常数,得到常数的值
            }
        }
Ejemplo n.º 5
0
        //返回result在对应的符号表中的类型
        public string getType(string result)
        {
            IN_1 = find_Table_Kind(result);
            switch (ARG)
            {
            case "VARG":     //标识符
                int      indexID = VarList.IndexOf(IN_1);
                VarTable BStmp   = (VarTable)VarTableList[indexID];
                return(BStmp.Type);

            case "TARG":     //临时变量
                int          indexTempID = TempVarList.IndexOf(IN_1);
                TempVarTable LStmp       = (TempVarTable)TempVarTableList[indexTempID];
                return(LStmp.Type);

            case "SARG":     //数组
                int        indexSZ = ArrayList.IndexOf(IN_1);
                ArrayTable SZtmp   = (ArrayTable)ArrayTableList[indexSZ];
                return(SZtmp.Type);

            default:
                return("real");    //理论上是不会运行到这里的,因为只在read的方法中才会使用,而read后面不会连接常数
            }
        }