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); }
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; }
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); }
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++; } } }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }