示例#1
0
 public static void AsyncInterprete(object ProgramText)
 {
     Analysis.Analyze((string[])ProgramText);
     Parser.Parser parser = new Parser.Parser();
     parser.ParseTable();
     parser = new Semantics.SDTranslator();
     parser.ParseTable();
     Semantics.SDTranslator.ParseTree.SemanticAnalysis();
 }
示例#2
0
 public static void SematicDebugging()
 {
     Analysis.Analyze(selectedCode);
     Parser.Parser parser = new Parser.Parser();
     parser.ParseTable();
     parser = new Semantics.SDTranslator();
     parser.ParseTable();
     Semantics.AnnoNode.debugging    = true;
     Semantics.AnnoNode.debug_update = false;
     Thread thread = new Thread(Semantics.SDTranslator.ParseTree.SemanticAnalysis);
 }
示例#3
0
        //Analyze semantics in current Node.
        public void SemanticAnalysis()
        {
            if (this.thisTok.ttype == Parser.Ttype.Terminal)
            {
                return;
            }
            UnifyScope();
            AnnoTree.NodeOnExecute = this;
            WaitforCommand();
            switch (this.mProduction.SDTRule[1])
            {
            case "fetch":
            {
                geneTok[0].SemanticAnalysis();
                this.mOp.setValue(geneTok[0].mOp.getValue());
                break;
            }

            case "Parseexpr":
            {
                SDTranslator.ParseExpr(this);
                break;
            }

            case "assign":
            {
                this.geneTok[0].SemanticAnalysis();
                this.geneTok[2].SemanticAnalysis();
                this.geneTok[0].mOp.setValue(this.geneTok[2].mOp.getValue());
                break;
            }

            case "getMem":    //fetch an Identifier
            {
                this.mOp = IdentiTable.FetchVal((Variables)this.geneTok[0].mOp, this.varTable);
                break;
            }

            case "getPoint":
            {
                this.geneTok[2].SemanticAnalysis();
                CMArray   arrayname = new CMArray();
                Variables varname   = (Variables)this.geneTok[0].mOp;
                arrayname.name      = varname.name;
                arrayname.Type      = varname.Type;
                this.geneTok[0].mOp = arrayname;
                this.mOp            = IdentiTable.FetchArray((CMArray)this.geneTok[0].mOp, this.geneTok[2].mOp.getValue(), this.varTable);
                break;
            }

            case "addID":
            {
                this.geneTok[1].SemanticAnalysis();

                if (geneTok[1].mOp.GetType().Name == "Variables")
                {
                    Variables newVari = new Variables();
                    newVari.Type = this.geneTok[0].mOp.getValue();
                    newVari.name = ((Variables)this.geneTok[1].mOp).name;

                    if (IdentiTable.declareVariable(newVari, ref this.varTable) == false)
                    {
                        UIHelper.Log("Semantic Error: double declare");
                        Thread.CurrentThread.Abort();
                    }
                    this.mOp = newVari;
                }
                else
                {
                    CMArray newArray = new CMArray();
                    newArray.name      = ((CMArray)this.geneTok[1].mOp).name;
                    newArray.Type      = this.geneTok[0].mOp.getValue();
                    newArray.currIndex = ((CMArray)this.geneTok[1].mOp).currIndex;
                    newArray.initArray(newArray.currIndex);
                    if (IdentiTable.declareArray(newArray, ref this.varTable) == false)
                    {
                        UIHelper.Log("Semantic Error: double declare");
                        Thread.CurrentThread.Abort();
                    }
                    this.mOp = newArray;
                }
                break;
            }

            case "for":
            {
                this.geneTok[2].SemanticAnalysis();
                this.geneTok[4].SemanticAnalysis();
                while (booleanBranch(geneTok[4].mOp.getValue()))
                {
                    geneTok[8].SemanticAnalysis();
                    geneTok[6].SemanticAnalysis();
                    geneTok[4].SemanticAnalysis();
                }

                break;
            }

            case "ifcon":
            {
                this.geneTok[2].SemanticAnalysis();
                if (booleanBranch(geneTok[2].mOp.getValue()))
                {
                    this.geneTok[4].SemanticAnalysis();
                }
                this.mOp.setValue("1");
                break;
            }

            case "elsecon":
            {
                geneTok[0].SemanticAnalysis();
                if (booleanBranch(geneTok[0].mOp.getValue()))
                {
                    break;
                }
                else
                {
                    geneTok[2].SemanticAnalysis();
                }
                break;
            }

            case "while":
            {
                geneTok[2].SemanticAnalysis();
                while (booleanBranch(geneTok[2].mOp.getValue()))
                {
                    this.geneTok[4].SemanticAnalysis();
                }
                break;
            }

            case "pass":
            {
                geneTok[0].SemanticAnalysis();
                break;
            }

            case "addTable":
            {
                geneTok[1].varTable        = new IdentiTable();
                geneTok[1].varTable.Parent = this.varTable;
                geneTok[1].SemanticAnalysis();
                IdentiTable.allTables.RemoveAt(IdentiTable.allTables.Count - 1);
                break;
            }

            case "pass2":
            {
                geneTok[0].SemanticAnalysis();
                geneTok[1].SemanticAnalysis();
                break;
            }

            case "input":
            {
                this.geneTok[2].SemanticAnalysis();
                while (AnnoTree.AttribQueue.Count != 0)
                {
                    Variables frontVari = AnnoTree.AttribQueue.Dequeue();
                    frontVari.setValue(UIHelper.getInput());
                }
                break;
            }

            case "pushStack":
            {
                this.geneTok[0].SemanticAnalysis();
                AnnoTree.AttribQueue.Enqueue((Variables)this.geneTok[0].mOp);
                if (this.geneTok.Length >= 2)
                {
                    this.geneTok[2].SemanticAnalysis();
                }
                break;
            }

            case "output":
            {
                this.geneTok[2].SemanticAnalysis();
                while (AnnoTree.AttribQueue.Count != 0)
                {
                    UIHelper.Output(AnnoTree.AttribQueue.Dequeue().getValue());
                }
                break;
            }

            default:
                break;
            }
        }