public static GATNode _localDeclarations(this LL1Processor ll1)
        {
            var node   = new GATNode();
            var offset = 1;

            var next = WordContainer.GetWordType(offset);

            while (next == WordType.ID)
            {
                var varDeclaration = ll1._varDeclaration();
                node.AddChild(varDeclaration);
                next = WordContainer.GetWordType(offset);
            }

            if (node.ChildCount() == 0)
            {
                node.generator = LocalDeclarations2;
            }
            else
            {
                node.generator = LocalDeclarations1;
            }

            return(node);
        }
Exemple #2
0
 public static GATNode _typeSpecifier(this LL1Processor ll1)
 {
     var node = new GATNode();
     var next = WordContainer.GetWordType();
     switch (next)
     {
         case WordType.INT:
             {
                 var INT = WordContainer.Advance();
                 node.AddChild(INT);
                 node.generator = typeSpecifier1;
                 break;
             }
         case WordType.VOID:
             {
                 var VOID = WordContainer.Advance();
                 node.AddChild(VOID);
                 node.generator = typeSpecifier2;
                 break;
             }
         default:
             {
                 throw new BNFException();
             }
     }
     return node;
 }
Exemple #3
0
        public static GATNode _declaration(this LL1Processor ll1)
        {
            var node   = new GATNode();
            var offset = 2;

            //
            node.name = "global";
            CodeGenerator.AddLabel("global", 0);
            //
            switch (WordContainer.GetWordType(offset))
            {
            case WordType.SEMICOLON:
            {
                var varDeclaration = ll1._varDeclaration();
                node.AddChild(varDeclaration);
                node.generator = Declaration1;
                break;
            }

            case WordType.BRACKET_L:
            {
                var funDeclaration = ll1._funDeclaration();
                node.AddChild(funDeclaration);
                node.generator = Declaration2;
                break;
            }

            default:
            {
                throw new BNFException();
            }
            }
            return(node);
        }
Exemple #4
0
        public static void Var(GATNode node)
        {
            Console.WriteLine(System.Reflection.MethodBase.GetCurrentMethod().ReflectedType.FullName);
            GATNode IDnode = node.getChild(0);

            node.SetProperty("value", IDnode.GetProperty("value"));
        }
        public static void Call(GATNode node)
        {
            //TODO:支持参数表,栈帧处理
            Console.WriteLine(System.Reflection.MethodBase.GetCurrentMethod().ReflectedType.FullName);

            var processName = node.getChild(0).GetProperty("value");

            var args   = node.getChild(1);
            var argNum = args.ChildCount();

            if (argNum == 0)
            {
                CodeGenerator.CallFunction(processName, new List <string>());
                node.SetProperty("value", "void");
            }
            else
            {
                var paramList = new List <string>();
                var argList   = args.getChild(0);
                for (int i = 0; i < argList.ChildCount(); i++)
                {
                    paramList.Add(argList.getChild(i).GetProperty("value"));
                }
                var retNode = CodeGenerator.CallFunction(processName, paramList);
                node.SetProperty("value", retNode);
            }
        }
        public static void SelectionStmt(GATNode node)
        {
            Console.WriteLine(System.Reflection.MethodBase.GetCurrentMethod().ReflectedType.FullName);
            var expression = node.getChild(0);

            switch (node.ChildCount())
            {
            case 4:
            {
                var falseLabel = node.getChild(3).GetProperty("LabelName");
                var jmpLine    = Int32.Parse(node.getChild(1).GetProperty("CodeLine"));
                CodeGenerator.SetCode(jmpLine, "je", expression.GetProperty("value"), "0", "0");
                CodeGenerator.PutLabel(falseLabel, jmpLine);
                break;
            }

            case 7:
            {
                var falseLabel = node.getChild(4).GetProperty("LabelName");
                var jmpLine    = Int32.Parse(node.getChild(1).GetProperty("CodeLine"));
                CodeGenerator.SetCode(jmpLine, "je", expression.GetProperty("value"), "0", "0");
                CodeGenerator.PutLabel(falseLabel, jmpLine);

                var endLabel    = node.getChild(6).GetProperty("LabelName");
                var trueEndLine = Int32.Parse(node.getChild(3).GetProperty("CodeLine"));
                CodeGenerator.SetCode(trueEndLine, "j", "#", "#", "#");
                CodeGenerator.PutLabel(endLabel, trueEndLine);
                break;
            }
            }
        }
        public static GATNode _selectionStmt(this LL1Processor ll1)
        {
            var node = new GATNode();

            node.generator = SelectionStmt;

            WordContainer.Advance(WordType.IF);
            WordContainer.Advance(WordType.BRACKET_L);
            var expression = ll1._expression();

            WordContainer.Advance(WordType.BRACKET_R);
            var statement = ll1._statement();

            node.AddChild(expression);         //0
            node.AddChild(GATNode.CodeNode()); //1
            node.AddChild(statement);          //2

            var next = WordContainer.GetWordType();

            if (next == WordType.ELSE)
            {
                WordContainer.Advance(WordType.ELSE);
                var elseStatement = ll1._statement();
                node.AddChild(GATNode.CodeNode());  //3
                node.AddChild(GATNode.LabelNode()); //4
                node.AddChild(elseStatement);       //5
            }
            node.AddChild(GATNode.LabelNode());     //3-6
            return(node);
        }
        public static void FunDeclaration(GATNode node)
        {
            //支持参数表
            Console.WriteLine(System.Reflection.MethodBase.GetCurrentMethod().ReflectedType.FullName);
            CodeGenerator.AddLabel(node.getChild(1).GetProperty("value"), Int32.Parse(node.getChild(3).GetProperty("CodeLine")));

            var funcName   = node.getChild(1).GetProperty("value");
            var returnType = node.getChild(0).GetProperty("value");
            var paramCount = node.getChild(2).ChildCount() == 0 ? 0 : node.getChild(2).getChild(0).ChildCount();
            var paramName  = new List <string>();

            if (paramCount != 0)
            {
                var paramList = node.getChild(2).getChild(0);
                for (int i = 0; i < paramList.ChildCount(); i++)
                {
                    var param = paramList.getChild(i);
                    paramName.Add(param.getChild(1).GetProperty("value"));
                }
            }
            CodeGenerator.AddFunction(new FunctionStackFrame
            {
                name           = funcName,
                returnType     = returnType,
                parameterCount = paramCount,
                parameterName  = paramName
            });
        }
        public static void Term(GATNode node)
        {
            int     childnum = node.ChildCount();
            string  mulop    = "";
            GATNode child;

            Console.WriteLine(System.Reflection.MethodBase.GetCurrentMethod().ReflectedType.FullName);

            child = node.getChild(0);
            node.SetProperty("value", child.GetProperty("value"));
            for (int i = 1; i < childnum; i++)
            {
                child = node.getChild(i);
                if (child.GetProperty("value") == "*")
                {
                    mulop = "*";
                }
                else if (child.GetProperty("value") == "/")
                {
                    mulop = "/";
                }
                else//有待解决如何记录结果
                {
                    CodeGenerator.AddCode(mulop, node.GetProperty("value"), child.GetProperty("value"), "T" + CodeGenerator.tempnum);
                    Console.WriteLine(mulop + " " + node.GetProperty("value") + " " + child.GetProperty("value") + " " + "T" + CodeGenerator.tempnum);
                    node.SetProperty("value", "T" + CodeGenerator.tempnum);
                    CodeGenerator.tempnum++;
                }
            }
        }
Exemple #10
0
        public static void Expression1(GATNode node)
        {
            //simple expression
            GATNode child;

            Console.WriteLine(System.Reflection.MethodBase.GetCurrentMethod().ReflectedType.FullName);

            child = node.getChild(0);
            node.SetProperty("value", child.GetProperty("value"));
        }
        public static GATNode _statement(this LL1Processor ll1)
        {
            var node = new GATNode();
            var next = WordContainer.GetWordType();

            if (ExpressionStmtProc.first.Contains(next))
            {
                var expressionStmt = ll1._expressionStmt();
                node.AddChild(expressionStmt);
                node.generator = Statement1;
                return(node);
            }
            var offset = 0;

            switch (WordContainer.GetWordType(offset))
            {
            case WordType.BRACE_L:
            {
                var compoundStmt = ll1._compoundStmt();
                node.AddChild(compoundStmt);
                node.generator = Statement2;
                break;
            }

            case WordType.IF:
            {
                var selectionStmt = ll1._selectionStmt();
                node.AddChild(selectionStmt);
                node.generator = Statement3;
                break;
            }

            case WordType.WHILE:
            {
                var iterationStmt = ll1._iterationStmt();
                node.AddChild(iterationStmt);
                node.generator = Statement4;
                break;
            }

            case WordType.RETURN:
            {
                var returnStmt = ll1._returnStmt();
                node.AddChild(returnStmt);
                node.generator = Statement5;
                break;
            }

            default:
            {
                throw new BNFException();
            }
            }
            return(node);
        }
        public static void program(GATNode node)
        {
            Console.WriteLine(System.Reflection.MethodBase.GetCurrentMethod().ReflectedType.FullName);

            var startLine = Int32.Parse(node.getChild(0).GetProperty("CodeLine"));

            CodeGenerator.SetCode(startLine, "j", "#", "#", "#");
            CodeGenerator.PutLabel("main", startLine);

            //CodeGenerator.AddLabel("global", 0);
        }
        public static GATNode _program(this LL1Processor ll1)
        {
            var node = new GATNode();

            node.generator = program;
            var declarationList = ll1._declarationList();

            node.AddChild(GATNode.CodeNode()); //0
            node.AddChild(declarationList);    //1
            WordContainer.Advance(WordType.HASHTAG);
            return(node);
        }
Exemple #14
0
        public static GATNode _factor(this LL1Processor ll1)
        {
            var node   = new GATNode();
            var offset = 0;

            switch (WordContainer.GetWordType(offset))
            {
            case WordType.BRACKET_L:
            {
                WordContainer.Advance(WordType.BRACKET_L);
                var expression = ll1._expression();
                node.AddChild(expression);
                node.generator = Factor1;
                WordContainer.Advance(WordType.BRACKET_R);
                break;
            }

            case WordType.ID:
            {
                offset = 1;
                if (WordContainer.GetWordType(offset) == WordType.BRACKET_L)
                {
                    var CALL = ll1._call();
                    node.AddChild(CALL);
                    node.generator = Factor2;
                }
                else
                {
                    var VAR = ll1._var();
                    node.AddChild(VAR);
                    node.generator = Factor3;
                }
                break;
            }

            case WordType.NUM:
            {
                var num = WordContainer.Advance(WordType.NUM);
                node.AddChild(num);
                node.generator = Factor4;
                break;
            }

            default:
            {
                throw new BNFException();
            }
            }
            return(node);
        }
Exemple #15
0
        public static void Expression2(GATNode node)
        {
            //var = expression
            GATNode left, right;

            Console.WriteLine(System.Reflection.MethodBase.GetCurrentMethod().ReflectedType.FullName);

            left  = node.getChild(0);
            right = node.getChild(1);

            node.SetProperty("value", left.GetProperty("value"));

            CodeGenerator.AddCode("=", right.GetProperty("value"), null, left.GetProperty("value"));
            Console.WriteLine("=" + " " + right.GetProperty("value") + " " + "\t" + " " + left.GetProperty("value"));
        }
        public static GATNode _call(this LL1Processor ll1)
        {
            var node = new GATNode();

            node.generator = Call;
            var id = WordContainer.Advance(WordType.ID);

            node.AddChild(id);//0
            WordContainer.Advance(WordType.BRACKET_L);
            var args = ll1._args();

            node.AddChild(args);//1
            WordContainer.Advance(WordType.BRACKET_R);
            return(node);
        }
Exemple #17
0
        public static void IterationStmt(GATNode node)
        {
            Console.WriteLine(System.Reflection.MethodBase.GetCurrentMethod().ReflectedType.FullName);

            var expressionLabel = node.getChild(0).GetProperty("LabelName");
            var endLabel        = node.getChild(5).GetProperty("LabelName");
            var jmpLine         = Int32.Parse(node.getChild(2).GetProperty("CodeLine"));
            var retLine         = Int32.Parse(node.getChild(4).GetProperty("CodeLine"));

            CodeGenerator.SetCode(retLine, "j", "#", "#", "#");
            CodeGenerator.PutLabel(expressionLabel, retLine);

            CodeGenerator.SetCode(jmpLine, "je", node.getChild(1).GetProperty("value"), "0", "#");
            CodeGenerator.PutLabel(endLabel, jmpLine);
        }
        public static GATNode _returnStmt(this LL1Processor ll1)
        {
            var node = new GATNode();

            node.generator = ReturnStmt;
            WordContainer.Advance(WordType.RETURN);
            var next = WordContainer.GetWordType();

            if (ExpressionProc.first.Contains(next))
            {
                var expression = ll1._expression();
                node.AddChild(expression);
            }
            WordContainer.Advance(WordType.SEMICOLON);
            return(node);
        }
        public static GATNode _compoundStmt(this LL1Processor ll1)
        {
            var node = new GATNode();

            node.generator = CompoundStmt;

            WordContainer.Advance(WordType.BRACE_L);
            var localDeclarations = ll1._localDeclarations();
            var statementList     = ll1._statementList();

            WordContainer.Advance(WordType.BRACE_R);

            node.AddChild(localDeclarations);
            node.AddChild(statementList);

            return(node);
        }
        public static GATNode _statementList(this LL1Processor ll1)
        {
            var node = new GATNode();

            node.generator = StatmentList;

            var next = WordContainer.GetWordType();

            while (StatementProc.first.Contains(next))
            {
                var statement = ll1._statement();
                node.AddChild(statement);

                next = WordContainer.GetWordType();
            }
            return(node);
        }
Exemple #21
0
        public static GATNode _params(this LL1Processor ll1)
        {
            var node   = new GATNode();
            var offset = 1;

            if (WordContainer.GetWordType(offset) == WordType.BRACKET_R)
            {
                WordContainer.Advance(WordType.VOID);
            }
            else
            {
                var paramList = ll1._paramList();
                node.AddChild(paramList);
                node.generator = Params;
            }
            return(node);
        }
Exemple #22
0
        public static GATNode _declarationList(this LL1Processor ll1)
        {
            var node = new GATNode();

            node.generator = DeclarationList;
            var declaration = ll1._declaration();

            node.AddChild(declaration);
            var next = WordContainer.GetWordType();

            while (DeclarationProc.first.Contains(next))
            {
                declaration = ll1._declaration();
                node.AddChild(declaration);
                next = WordContainer.GetWordType();
            }
            return(node);
        }
        public static void varDeclaration(GATNode node)
        {
            Console.WriteLine(System.Reflection.MethodBase.GetCurrentMethod().ReflectedType.FullName);

            string type, id;

            type = node.getChild(0).GetProperty("value");
            id   = node.getChild(1).GetProperty("value");
            node.SetProperty("value", id);
            node.SetProperty("type", type);
            GATNode process = node.GetParent();

            while (process.name == "")
            {
                process = process.GetParent();
            }
            CodeGenerator.AddSymbol(node.GetProperty("value"), process.name, null);
        }
Exemple #24
0
        public static GATNode _var(this LL1Processor ll1)
        {
            var node = new GATNode();

            node.generator = Var;
            var id = WordContainer.Advance(WordType.ID);

            node.AddChild(id);
            var next = WordContainer.GetWordType();

            if (next == WordType.SQUARE_BRACKET_L)
            {
                WordContainer.Advance(WordType.SQUARE_BRACKET_L);
                var expression = ll1._expression();
                node.AddChild(expression);
                WordContainer.Advance(WordType.SQUARE_BRACKET_R);
            }
            return(node);
        }
Exemple #25
0
        public static GATNode _iterationStmt(this LL1Processor ll1)
        {
            var node = new GATNode();

            node.generator = IterationStmt;
            WordContainer.Advance(WordType.WHILE);
            WordContainer.Advance(WordType.BRACKET_L);
            node.AddChild(GATNode.LabelNode());//0
            var expression = ll1._expression();

            node.AddChild(expression);         //1
            node.AddChild(GATNode.CodeNode()); //2
            WordContainer.Advance(WordType.BRACKET_R);
            var statement = ll1._statement();

            node.AddChild(statement);           //3
            node.AddChild(GATNode.CodeNode());  //4
            node.AddChild(GATNode.LabelNode()); //5
            return(node);
        }
        public static GATNode _additiveExpression(this LL1Processor ll1)
        {
            var node = new GATNode();

            node.generator = AdditiveExpression;
            var term1 = ll1._term();

            node.AddChild(term1);
            var next = WordContainer.GetWordType();

            while (next == WordType.ADDOP)
            {
                var addop = WordContainer.Advance(WordType.ADDOP);
                node.AddChild(addop);
                var term2 = ll1._term();
                node.AddChild(term2);
                next = WordContainer.GetWordType();
            }
            return(node);
        }
Exemple #27
0
        public static GATNode _simpleExpression(this LL1Processor ll1)
        {
            var node = new GATNode();

            node.generator = SimpleExpression;
            var additiveExpression1 = ll1._additiveExpression();

            node.AddChild(additiveExpression1);
            var next = WordContainer.GetWordType();

            while (next == WordType.RELOP)
            {
                var relop = WordContainer.Advance(WordType.RELOP);
                node.AddChild(relop);
                var additiveExpression2 = ll1._additiveExpression();
                node.AddChild(additiveExpression2);
                next = WordContainer.GetWordType();
            }
            return(node);
        }
        public static GATNode _argList(this LL1Processor ll1)
        {
            var node = new GATNode();

            node.generator = ArgList;
            var expression1 = ll1._expression();

            node.AddChild(expression1);
            var next = WordContainer.GetWordType();

            while (next == WordType.COMMA)
            {
                WordContainer.Advance(WordType.COMMA);
                var expression2 = ll1._expression();
                node.AddChild(expression2);
                next = WordContainer.GetWordType();
            }

            return(node);
        }
        public static GATNode _term(this LL1Processor ll1)
        {
            var node = new GATNode();

            node.generator = Term;
            var factor1 = ll1._factor();

            node.AddChild(factor1);
            var next = WordContainer.GetWordType();

            while (next == WordType.MULOP)
            {
                var mulop = WordContainer.Advance(WordType.MULOP);
                node.AddChild(mulop);
                var factor2 = ll1._factor();
                node.AddChild(factor2);
                next = WordContainer.GetWordType();
            }
            return(node);
        }
Exemple #30
0
        public static GATNode _args(this LL1Processor ll1)
        {
            var node = new GATNode();
            var next = WordContainer.GetWordType();

            if (ArgListProc.first.Contains(next))
            {
                var argList = ll1._argList();
                node.AddChild(argList);
            }

            if (node.ChildCount() == 0)
            {
                node.generator = Args2;
            }
            else
            {
                node.generator = Args1;
            }
            return(node);
        }