//因子
        private void Factor()
        {
            LexicalAnalysisResult lex = (LexicalAnalysisResult)Lexresult[i];

            if (lex.Type == LexicalAnalysis.IDSY)
            {
                //检查标识符存不存在
                //没检查同层但是不同过程的相关声明,需要在符号表栈中标记
                int preloc = -1;
                for (int ind = symbols.Count - 1; ind >= 0; ind--)
                {
                    Symbols tempsym = (Symbols)symbols[ind];
                    if (lex.Content.Equals(tempsym.Name) && level >= tempsym.Level)
                    {
                        preloc = ind;
                        break;
                    }
                }
                if (preloc == -1)
                {
                    flag = false;
                    Console.WriteLine("错误:不存在符号{0}", lex.Content);
                    String msg = "错误:不存在符号" + lex.Content;
                    errors.Add(new Error(msg, lex.Line));
                    return;
                }
                //PCODE 标识符相关
                PCodes.Add(new PCode(codeAddr, PCode.INT, 0, 1));
                codeAddr++;
                Symbols sym_t   = (Symbols)symbols[preloc];
                int     sym_lev = sym_t.Level;
                PCodes.Add(new PCode(codeAddr, PCode.LOD, level - sym_lev, sym_t.Addr));
                codeAddr++;
                i++;
                return;
            }
            else if (lex.Type == LexicalAnalysis.INTSY)
            {
                int Num = Convert.ToInt32(lex.Content);
                //PCODE 数字相关
                PCodes.Add(new PCode(codeAddr, PCode.INT, 0, 1));
                codeAddr++;
                PCodes.Add(new PCode(codeAddr, PCode.LIT, 0, Num));
                codeAddr++;
                i++;
                return;
            }
            else if (lex.Type == LexicalAnalysis.LPARSY)
            {
                i++;
                ExpressionCode();
                //i++
                lex = (LexicalAnalysisResult)Lexresult[i];
                if (lex.Type != LexicalAnalysis.RPARSY)
                {
                    flag = false;
                    Console.WriteLine("错误:此处应为 ( ");
                    errors.Add(new Error("错误:此处应为 ( ", lex.Line));
                    return;
                }
                else
                {
                    //P-CODE
                    i++;
                    return;
                }
            }
            else
            {
                flag = false;
                Console.WriteLine("错误:缺少标识符、数字或(");
                errors.Add(new Error("错误:缺少标识符、数字或(", lex.Line));
                return;
            }
        }
        //赋值语句
        private void AssignCode()
        {
            LexicalAnalysisResult lex = (LexicalAnalysisResult)Lexresult[i];

            if (lex.Type != LexicalAnalysis.IDSY)
            {
                flag = false;
                Console.WriteLine("错误:赋值语句无标识符");
                errors.Add(new Error("错误:其他错误", lex.Line));
                return;
            }
            //符号表检查
            int preloc = -1;

            //之前的同一层符号表还没有检查
            for (int ind = symbols.Count - 1; ind >= 0; ind--)
            {
                Symbols tempsym = (Symbols)symbols[ind];
                if (lex.Content.Equals(tempsym.Name) && level >= tempsym.Level)
                {
                    preloc = ind;
                    break;
                }
            }
            if (preloc == -1)
            {
                flag = false;
                Console.WriteLine("错误:不存在符号{0}", lex.Content);
                errors.Add(new Error("错误:不存在符号" + lex.Content, lex.Line));
                return;
            }
            //PCODE 标识符相关
            PCodes.Add(new PCode(codeAddr, PCode.INT, 0, 1));
            codeAddr++;
            Symbols sym_t   = (Symbols)symbols[preloc];
            int     sym_lev = sym_t.Level;

            PCodes.Add(new PCode(codeAddr, PCode.LOD, level - sym_lev, sym_t.Addr));
            codeAddr++;
            //表达式检查
            i++;
            lex = (LexicalAnalysisResult)Lexresult[i];
            if (lex.Type != LexicalAnalysis.ASSIGNSY)
            {
                flag = false;
                Console.WriteLine("错误:此处应为赋值符号");
                errors.Add(new Error("错误:应为赋值符号 :=", lex.Line));
                return;
            }
            i++;
            //进入表达式判断
            ExpressionCode();
            if (flag == true)
            {
                //PCODE
                PCodes.Add(new PCode(codeAddr, PCode.STO, level - sym_lev, sym_t.Addr));
                codeAddr++;
                return;
            }
            else
            {
                Console.WriteLine("Error!");
                errors.Add(new Error("错误:其他错误。", 0));
                return;
            }
        }
        //过程说明部分
        private void ProcIndicate()
        {
            //JMP 0 主程序入口
            PCodes.Add(new PCode(codeAddr, PCode.JMP, 0, 0));
            int bufcodeaddr = codeAddr;

            //JMP此处的0表示待定
            codeAddr++;
            LexicalAnalysisResult lex = (LexicalAnalysisResult)Lexresult[i];

            //标识符
            if (lex.Type != LexicalAnalysis.IDSY)
            {
                flag = false;
                Console.WriteLine("错误:procedure后应为标识符");
                errors.Add(new Error("错误:procedure后应为标识符", lex.Line));
                return;
            }
            Symbols sym = new Symbols();

            sym.Name  = lex.Content;
            sym.Type  = (int)Symbols.SymTypes.PROC;
            sym.Level = level;
            sym.Value = codeAddr + 1;
            sym.Addr  = addr[level];
            addr[level]++;
            //;
            PCodes.Add(new PCode(codeAddr, PCode.JMP, 0, codeAddr + 1));
            codeAddr++;

            i++;
            lex = (LexicalAnalysisResult)Lexresult[i];
            if (lex.Type != LexicalAnalysis.SEMISY)
            {
                flag = false;
                Console.WriteLine("缺少 ;");
                errors.Add(new Error("错误:缺少 ;", lex.Line));
                return;
            }
            for (int i = symbols.Count - 1; i >= 0; i--)
            {
                Symbols tempsym = (Symbols)symbols[i];
                if (tempsym.Name.Equals(sym.Name) && level == tempsym.Level)
                {
                    flag = false;
                    Console.WriteLine("错误:符号表已存在标识符" + sym.Name);
                    errors.Add(new Error("错误:符号表已存在标识符" + sym.Name, lex.Line));
                    return;
                }
            }
            symbols.Add(sym);
            i++;
            level++;
            if (level > 10)
            {
                flag = false;
                errors.Add(new Error("错误:分程序层次过多", lex.Line));
                return;
            }
            Program();
            //符号表删除
            int cnt = symbols.Count - 1;

            for (int i = cnt; i >= 0; i--)
            {
                Symbols sym_prerem = (Symbols)symbols[i];
                if (sym_prerem.Level == level)
                {
                    symbols.RemoveAt(i);
                }
            }
            level--;
            //i++;
            lex = (LexicalAnalysisResult)Lexresult[i];
            if (lex.Type != LexicalAnalysis.SEMISY)
            {
                flag = false;
                Console.WriteLine("缺少 ;");
                errors.Add(new Error("错误:缺少 ;", lex.Line));
                return;
            }
            i++;

            PCode pc = (PCode)PCodes[bufcodeaddr];

            pc.Y = codeAddr;

            PCodes.Add(new PCode(codeAddr, PCode.OPR, 0, 0));
            codeAddr++;

            lex = (LexicalAnalysisResult)Lexresult[i];
            if (lex.Type == LexicalAnalysis.PROCEDURE)
            {
                i++;
                ProcIndicate();
            }
            else
            {
                //i++;
                return;
            }
        }
        //变量说明部分
        private void VarIndicate()
        {
            LexicalAnalysisResult lex = (LexicalAnalysisResult)Lexresult[i];

            if (lex.Type != LexicalAnalysis.IDSY)
            {
                flag = false;
                Console.WriteLine("错误:var后面应为标识符");
                errors.Add(new Error("错误:var后面应为标识符", lex.Line));
                return;
            }
            Symbols sym = new Symbols();

            sym.Type  = (int)Symbols.SymTypes.VAR;
            sym.Name  = lex.Content;
            sym.Level = level;
            sym.Addr  = addr[level];
            addr[level]++;
            i++;
            lex = (LexicalAnalysisResult)Lexresult[i];
            if (lex.Type == LexicalAnalysis.COMMASY)
            {
                for (int i = symbols.Count - 1; i >= 0; i--)
                {
                    Symbols tempsym = (Symbols)symbols[i];
                    if (tempsym.Name.Equals(sym.Name) && level == tempsym.Level)
                    {
                        flag = false;
                        Console.WriteLine("错误:符号表已存在标识符" + sym.Name);
                        errors.Add(new Error("错误:符号表已存在标识符" + sym.Name, lex.Line));
                        return;
                    }
                }
                symbols.Add(sym);
                i++;
                VarIndicate();
            }
            else if (lex.Type == LexicalAnalysis.SEMISY)
            {
                for (int i = symbols.Count - 1; i >= 0; i--)
                {
                    Symbols tempsym = (Symbols)symbols[i];
                    if (tempsym.Name.Equals(sym.Name) && level == tempsym.Level)
                    {
                        flag = false;
                        Console.WriteLine("错误:符号表已存在标识符" + sym.Name);
                        errors.Add(new Error("错误:符号表已存在标识符" + sym.Name, lex.Line));
                        return;
                    }
                }
                symbols.Add(sym);
                i++;
                return;
            }
            else
            {
                flag = false;
                Console.WriteLine("错误:符号应为 , 或 ;");
                errors.Add(new Error("错误:符号应为 , 或 ;", lex.Line));
                return;
            }
        }
        //常量说明部分
        private void ConstIndicate()
        {
            if (i >= Lexresult.Count)
            {
                flag = false;
                Console.WriteLine("错误:程序没有语句!");
                errors.Add(new Error("错误:程序没有语句。", 0));
                return;
            }
            LexicalAnalysisResult lex = (LexicalAnalysisResult)Lexresult[i];

            //常量定义
            if (lex.Type != LexicalAnalysis.IDSY)
            {
                flag = false;
                Console.WriteLine("错误:常量const后无标识符");
                errors.Add(new Error("错误:常量const后无标识符", lex.Line));
                return;
            }
            else
            {
                Symbols sym = new Symbols();
                sym.Type  = (int)Symbols.SymTypes.CONST;
                sym.Level = 0;
                sym.Addr  = 0;
                sym.Name  = lex.Content;
                //addr[level]++;
                i++;
                lex = (LexicalAnalysisResult)Lexresult[i];
                if (lex.Type != LexicalAnalysis.EQUSY)
                {
                    flag = false;
                    Console.WriteLine("错误:const标识符后无=符号");
                    errors.Add(new Error("错误:const标识符后无=符号", lex.Line));
                    return;
                }
                i++;
                lex = (LexicalAnalysisResult)Lexresult[i];
                if (lex.Type != LexicalAnalysis.INTSY)
                {
                    flag = false;
                    Console.WriteLine("错误:常量标识符赋值应为无符号整数");
                    errors.Add(new Error("错误:常量标识符赋值应为无符号整数", lex.Line));
                    return;
                }
                if (Convert.ToInt64(lex.Content) > Convert.ToInt64(Int32.MaxValue))
                {
                    flag = false;
                    Console.WriteLine("错误:整数太大");
                    errors.Add(new Error("错误:整数太大", lex.Line));
                    return;
                }
                sym.Value = Convert.ToInt32(lex.Content);
                for (int i = symbols.Count - 1; i >= 0; i--)
                {
                    Symbols tempsym = (Symbols)symbols[i];
                    if (tempsym.Name.Equals(sym.Name) && level == tempsym.Level)
                    {
                        flag = false;
                        Console.WriteLine("错误:符号表已存在标识符" + sym.Name);
                        errors.Add(new Error("错误:符号表已存在标识符" + sym.Name, lex.Line));
                        return;
                    }
                }
                symbols.Add(sym);
                //递归子程序或结束
                i++;
                lex = (LexicalAnalysisResult)Lexresult[i];
                if (lex.Type == LexicalAnalysis.SEMISY)
                {
                    i++;
                    return;
                }
                else if (lex.Type == LexicalAnalysis.COMMASY)
                {
                    i++;
                    ConstIndicate();
                }
                else
                {
                    flag = false;
                    Console.WriteLine("错误:符号应为 , 或 ;");
                    errors.Add(new Error("错误:符号应为 , 或 ;", lex.Line));
                    return;
                }
            }
        }
        //写语句
        private void WriteCode()
        {
            LexicalAnalysisResult lex = (LexicalAnalysisResult)Lexresult[i];

            if (lex.Type != LexicalAnalysis.WRITESY)
            {
                flag = false;
                Console.WriteLine("Error!");
                errors.Add(new Error("错误:其他错误。", 0));
                return;
            }
            i++;
            lex = (LexicalAnalysisResult)Lexresult[i];
            if (lex.Type != LexicalAnalysis.LPARSY)
            {
                flag = false;
                Console.WriteLine("错误:此处应为(");
                errors.Add(new Error("错误:此处应补充(", lex.Line));
                return;
            }
            i++;
            lex = (LexicalAnalysisResult)Lexresult[i];
            if (lex.Type == LexicalAnalysis.IDSY)
            {
                //PCODE?
                //检查符号表
                int preloc = -1;
                for (int ind = symbols.Count - 1; ind >= 0; ind--)
                {
                    Symbols tempsym = (Symbols)symbols[ind];
                    if (lex.Content.Equals(tempsym.Name) && level >= tempsym.Level)
                    {
                        preloc = ind;
                        break;
                    }
                }
                if (preloc == -1)
                {
                    flag = false;
                    Console.WriteLine("错误:不存在符号{0}", lex.Content);
                    errors.Add(new Error("错误:不存在符号" + lex.Content, lex.Line));
                    return;
                }
                Symbols sym = (Symbols)symbols[preloc];
                PCodes.Add(new PCode(codeAddr, PCode.INT, 0, 1));
                codeAddr++;
                PCodes.Add(new PCode(codeAddr, PCode.LOD, level - sym.Level, sym.Addr));
                codeAddr++;
                PCodes.Add(new PCode(codeAddr, PCode.WRT, 0, 0));
                codeAddr++;
                i++;
            }
            else if (lex.Type == LexicalAnalysis.INTSY)
            {
                PCodes.Add(new PCode(codeAddr, PCode.INT, 0, 1));
                codeAddr++;
                PCodes.Add(new PCode(codeAddr, PCode.LIT, 0, Convert.ToInt32(lex.Content)));
                codeAddr++;
                PCodes.Add(new PCode(codeAddr, PCode.WRT, 0, 0));
                codeAddr++;
                i++;
            }
            else
            {
                flag = false;
                Console.WriteLine("无标识符");
                errors.Add(new Error("错误:无标识符", lex.Line));
                return;
            }
            lex = (LexicalAnalysisResult)Lexresult[i];
            while (lex.Type == LexicalAnalysis.COMMASY)
            {
                i++;
                lex = (LexicalAnalysisResult)Lexresult[i];
                if (lex.Type == LexicalAnalysis.IDSY)
                {
                    //PCODE?
                    //检查符号表
                    int preloc = -1;
                    for (int ind = symbols.Count - 1; ind >= 0; ind--)
                    {
                        Symbols tempsym = (Symbols)symbols[ind];
                        if (lex.Content.Equals(tempsym.Name) && level >= tempsym.Level)
                        {
                            preloc = ind;
                            break;
                        }
                    }
                    if (preloc == -1)
                    {
                        flag = false;
                        Console.WriteLine("错误:不存在符号{0}", lex.Content);
                        errors.Add(new Error("错误:不存在符号" + lex.Content, lex.Line));
                        return;
                    }
                    Symbols sym = (Symbols)symbols[preloc];
                    PCodes.Add(new PCode(codeAddr, PCode.INT, 0, 1));
                    codeAddr++;
                    PCodes.Add(new PCode(codeAddr, PCode.LOD, level - sym.Level, sym.Addr));
                    codeAddr++;
                    PCodes.Add(new PCode(codeAddr, PCode.WRT, 0, 0));
                    codeAddr++;
                    //i++;
                }
                else if (lex.Type == LexicalAnalysis.INTSY)
                {
                    PCodes.Add(new PCode(codeAddr, PCode.INT, 0, 1));
                    codeAddr++;
                    PCodes.Add(new PCode(codeAddr, PCode.LIT, 0, Convert.ToInt32(lex.Content)));
                    codeAddr++;
                    PCodes.Add(new PCode(codeAddr, PCode.WRT, 0, 0));
                    codeAddr++;
                }
                else
                {
                    flag = false;
                    Console.WriteLine("无标识符");
                    errors.Add(new Error("错误:无标识符", lex.Line));
                    return;
                }
                i++;
                lex = (LexicalAnalysisResult)Lexresult[i];
            }
            if (lex.Type != LexicalAnalysis.RPARSY)
            {
                flag = false;
                Console.WriteLine("错误:此处应为)");
                errors.Add(new Error("错误:此处应补充)", lex.Line));
                return;
            }
            else
            {
                i++;
                return;
            }
        }