private Property_SE FillSentenceGram()
        {
            if (this.varTable.GetItem(this.matchIndex).varType == ConstTable.VariableType.Identity)
            {
                this.matchIndex++;
            }
            string firstEntity = this.varTable.GetItem(this.matchIndex - 1).varValue;


            if (this.varTable.GetItem(this.matchIndex).varValue.Equals(":="))
            {
                this.matchIndex++;
            }
            string opString = this.varTable.GetItem(this.matchIndex - 1).varValue;

            Property_CalcuE CalcuE = CalcuExpGram();

            if (this.varTable.GetItem(this.matchIndex).varValue.Equals(";"))
            {
                this.matchIndex++;
            }

            Property_SE SE = new Property_SE();

            QuaternionItem item1 = new QuaternionItem(this.globalQuad, opString, CalcuE.VarValue, NullQuaternionElement, firstEntity, ConstTable.QuaternionType.FILLEXP);

            this.QuaternionTb.Add(item1);
            this.globalQuad++;

            return(SE);
        }
 /// <summary>
 /// 根据分析出的运行时表以及四元式,检测变量的使用错误
 /// </summary>
 public void CheckVar()
 {
     for (int i = 0; i < this.QuaternionTb.Count; i++)
     {
         QuaternionItem item        = QuaternionTb.GetItem(i);
         string         firstEntity = item.FirstEnity;
         if (isIdentity(firstEntity))
         {
             if (!RuntimeVarTb.isExists(firstEntity))
             {
                 System.Console.WriteLine("使用未声明的变量<{0}>", new object[] { firstEntity });
             }
         }
         string secondEntity = item.SecondEntity;
         if (isIdentity(secondEntity))
         {
             if (!RuntimeVarTb.isExists(secondEntity))
             {
                 System.Console.WriteLine("使用未声明的变量<{0}>", new object[] { secondEntity });
             }
         }
         if (item.OpString.Equals(":="))
         {
             string resultString = item.NextQuad.ToString();
             if (!RuntimeVarTb.isExists(resultString))
             {
                 System.Console.WriteLine("使用未声明的变量<{0}>", new object[] { secondEntity });
             }
         }
     }
 }
        /// <summary>
        /// Calculator_
        /// </summary>
        /// <param name="firstCalcuE"></param>
        /// <returns></returns>
        private Property_CalcuE Calculator_Gram(Property_CalcuE firstCalcuE)
        {
            if (this.varTable.GetItem(this.matchIndex).varValue.Equals("+"))
            {
                this.matchIndex++;
            }
            else
            {
                return(firstCalcuE);
            }

            string opString = this.varTable.GetItem(this.matchIndex - 1).varValue;

            Property_CalcuE secondCalcuE = CalcuExpGram();

            Property_CalcuE CalcuE = new Property_CalcuE("@T" + this.tempVarIndex++);

            QuaternionItem item1 = new QuaternionItem(this.globalQuad, opString, firstCalcuE.VarValue, secondCalcuE.VarValue, CalcuE.VarValue, ConstTable.QuaternionType.CALCUEXP);

            this.QuaternionTb.Add(item1);
            this.globalQuad++;


            return(Calculator_Gram(CalcuE));
        }
        /// <summary>
        /// XHSentence
        /// </summary>
        /// <returns></returns>
        private Property_SE XHSentenceGram()
        {
            if (this.varTable.GetItem(this.matchIndex).varValue.Equals("while"))
            {
                this.matchIndex++;
            }

            Property_ME ME1 = new Property_ME(this.globalQuad);

            Property_BoolE BoolE = BoolExpGram();

            if (this.varTable.GetItem(this.matchIndex).varValue.Equals("do"))
            {
                this.matchIndex++;
            }

            Property_ME ME2 = new Property_ME(this.globalQuad);


            Property_SE SE1 = new Property_SE();

            if (this.varTable.GetItem(this.matchIndex).varType == ConstTable.VariableType.Identity)
            {
                SE1 = FillSentenceGram();
            }
            else if (this.varTable.GetItem(this.matchIndex).varValue.Equals("if"))
            {
                SE1 = FZSentenceGram();
            }
            else if (this.varTable.GetItem(this.matchIndex).varValue.Equals("while"))
            {
                SE1 = XHSentenceGram();
            }
            else if (this.varTable.GetItem(this.matchIndex).varValue.Equals("begin"))
            {
                SE1 = ComplexSentenceGram();
            }

            Property_SE SE = new Property_SE();

            BackPatch(SE1.NextList, ME1.Quad);
            BackPatch(BoolE.TrueList, ME2.Quad);
            SE.NextList = BoolE.FalseList;

            QuaternionItem item1 = new QuaternionItem(this.globalQuad, NullQuaternionElement, NullQuaternionElement, NullQuaternionElement, ME1.Quad, ConstTable.QuaternionType.WHILEEXP);

            this.QuaternionTb.Add(item1);
            this.globalQuad++;

            return(SE);
        }
        /// <summary>
        /// 如果分析出比较语句,产生四元式,并且写出属性文法
        /// </summary>
        /// <returns></returns>
        private Property_BoolE CompareEGram()
        {
            bool   EntityResult = EntityGram();
            string firstEntity  = this.varTable.GetItem(this.matchIndex - 1).varValue;

            bool   BoolOptResult = BoolOptGram();
            string opString      = this.varTable.GetItem(this.matchIndex - 1).varValue;

            bool   EntityResult2 = EntityGram();
            string secondEntity  = this.varTable.GetItem(this.matchIndex - 1).varValue;


            Property_BoolE BoolE = new Property_BoolE();

            if (EntityResult && BoolOptResult && EntityResult2)
            {
                QuaternionItem item1 = new QuaternionItem(this.globalQuad, opString, firstEntity, secondEntity, 0, ConstTable.QuaternionType.BOOLEXP);
                this.globalQuad++;
                QuaternionItem item2 = new QuaternionItem(this.globalQuad, NullQuaternionElement, NullQuaternionElement, NullQuaternionElement, 0, ConstTable.QuaternionType.BOOLEXP);
                this.QuaternionTb.Add(item1);
                this.QuaternionTb.Add(item2);

                BoolE = new Property_BoolE();
                List <int> trueList = new List <int>();
                trueList.Add(this.globalQuad - 1);
                BoolE.TrueList = trueList;
                List <int> falseList = new List <int>();
                falseList.Add(this.globalQuad);
                BoolE.FalseList = falseList;

                this.globalQuad++;
            }


            return(BoolE);
        }
        /// <summary>
        /// FZSentence
        /// </summary>
        /// <returns></returns>
        private Property_SE FZSentenceGram()
        {
            if (this.varTable.GetItem(this.matchIndex).varValue.Equals("if"))
            {
                this.matchIndex++;
            }

            Property_BoolE BoolE = BoolExpGram();

            if (this.varTable.GetItem(this.matchIndex).varValue.Equals("then"))
            {
                this.matchIndex++;
            }

            Property_ME ME1 = new Property_ME(this.globalQuad);


            Property_SE SE1 = new Property_SE();

            if (this.varTable.GetItem(this.matchIndex).varType == ConstTable.VariableType.Identity)
            {
                SE1 = FillSentenceGram();
            }
            else if (this.varTable.GetItem(this.matchIndex).varValue.Equals("if"))
            {
                SE1 = FZSentenceGram();
            }
            else if (this.varTable.GetItem(this.matchIndex).varValue.Equals("while"))
            {
                SE1 = XHSentenceGram();
            }
            else if (this.varTable.GetItem(this.matchIndex).varValue.Equals("begin"))
            {
                SE1 = ComplexSentenceGram();
            }

            Property_SE SE = new Property_SE();

            if (this.varTable.GetItem(this.matchIndex).varValue.Equals("else"))
            {
                Property_NE NE       = new Property_NE();
                List <int>  nextList = new List <int>();
                nextList.Add(this.globalQuad);
                NE.NextList = nextList;

                QuaternionItem item1 = new QuaternionItem(this.globalQuad, NullQuaternionElement, NullQuaternionElement, NullQuaternionElement, 0, ConstTable.QuaternionType.NEXP);
                this.QuaternionTb.Add(item1);
                this.globalQuad++;

                if (this.varTable.GetItem(this.matchIndex).varValue.Equals("else"))
                {
                    this.matchIndex++;
                }

                Property_ME ME2 = new Property_ME(this.globalQuad);

                Property_SE SE2 = new Property_SE();
                if (this.varTable.GetItem(this.matchIndex).varType == ConstTable.VariableType.Identity)
                {
                    SE2 = FillSentenceGram();
                }
                else if (this.varTable.GetItem(this.matchIndex).varValue.Equals("if"))
                {
                    SE2 = FZSentenceGram();
                }
                else if (this.varTable.GetItem(this.matchIndex).varValue.Equals("while"))
                {
                    SE2 = XHSentenceGram();
                }
                else if (this.varTable.GetItem(this.matchIndex).varValue.Equals("begin"))
                {
                    SE2 = ComplexSentenceGram();
                }

                BackPatch(BoolE.TrueList, ME1.Quad);
                BackPatch(BoolE.FalseList, ME2.Quad);
                SE.NextList = Merge(Merge(SE1.NextList, NE.NextList), SE2.NextList);
            }
            else
            {
                BackPatch(BoolE.TrueList, ME1.Quad);
                SE.NextList = Merge(BoolE.FalseList, SE1.NextList);
            }

            return(SE);
        }
Пример #7
0
 /// <summary>
 /// 向表中插入一条
 /// </summary>
 /// <param name="item"></param>
 public void Add(QuaternionItem item)
 {
     table.Add(item);
 }