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 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 _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 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 _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 _expression(this LL1Processor ll1) { var node = new GATNode(); var offset = 0; var search = WordContainer.GetWordType(offset); var depth = 0; var finishSearch = false; while (search != WordType.IGNORE) { switch (search) { case WordType.SEMICOLON: { var simpleExpression = ll1._simpleExpression(); node.AddChild(simpleExpression); node.generator = Expression1; finishSearch = true; break; } case WordType.EQUAL: { var VAR = ll1._var(); node.AddChild(VAR); node.generator = Expression2; WordContainer.Advance(WordType.EQUAL); var expression = ll1._expression(); node.AddChild(expression); finishSearch = true; break; } case WordType.BRACKET_L: { depth++; break; } case WordType.BRACKET_R: { depth--; if (depth < 0) { var simpleExpression = ll1._simpleExpression(); node.AddChild(simpleExpression); node.generator = Expression1; finishSearch = true; } break; } } if (finishSearch) { break; } offset++; search = WordContainer.GetWordType(offset); } return(node); }