public static ExpressionNode parse(int TokenNumber) { ExpressionNode node = new ExpressionNode(); if (Parser.NeededToken(TokenNumber, "type", "int", 0)) { node.ExpressionType = "literal"; node.IntegerLiteral = Parser.TokensArray[TokenNumber].Value; TokenNumber++; node.TokenNumber = TokenNumber; return(node); } if (Parser.NeededToken(TokenNumber, "type", "bool", 0)) { node.ExpressionType = "literal"; node.BooleanLiteral = Parser.TokensArray[TokenNumber].Value; TokenNumber++; node.TokenNumber = TokenNumber; return(node); } if (Parser.NeededToken(TokenNumber, "type", "float", 0)) { node.ExpressionType = "literal"; node.FloatLiteral = Parser.TokensArray[TokenNumber].Value; TokenNumber++; node.TokenNumber = TokenNumber; return(node); } CallNode cnode = CallParser.parse(TokenNumber); if (cnode.BadParsed) { node.BadParsed = true; node.ErrorLine = cnode.ErrorLine; return(node); } node.ExpressionType = "call"; node.TokenNumber = cnode.TokenNumber; node.SetCall(cnode); return(node); }
public static List <Node> parse(int TokenNumber) { List <Node> BodyNodes = new List <Node>(); while (true) { if (!(Parser.NeededToken(TokenNumber, "type", "name", 0) || Parser.NeededToken(TokenNumber, "value", "while", 0) || Parser.NeededToken(TokenNumber, "value", "if", 0) || Parser.NeededToken(TokenNumber, "value", "return", 0) || Parser.NeededToken(TokenNumber, "value", "var", 0) || Parser.NeededToken(TokenNumber, "value", "this", 0))) { return(BodyNodes); } VariableDeclarationNode VariableNode = VariableDeclarationParser.parse(TokenNumber); if (!VariableNode.BadParsed) { BodyNodes.Add(VariableNode); TokenNumber = VariableNode.TokenNumber; continue; } AssignmentNode anode = AssignmentParser.parse(TokenNumber); if (!anode.BadParsed) { BodyNodes.Add(anode); TokenNumber = anode.TokenNumber; continue; } WhileLoopNode LoopNode = WhileLoopParser.parse(TokenNumber); if (!LoopNode.BadParsed) { BodyNodes.Add(LoopNode); TokenNumber = LoopNode.TokenNumber; continue; } IfStatementNode IfNode = IfStatementParser.parse(TokenNumber); if (!IfNode.BadParsed) { BodyNodes.Add(IfNode); TokenNumber = IfNode.TokenNumber; continue; } ReturnStatementNode ReturnNode = ReturnStatementParser.parse(TokenNumber); if (!ReturnNode.BadParsed) { BodyNodes.Add(ReturnNode); TokenNumber = ReturnNode.TokenNumber; continue; } CallNode cnode = CallParser.parse(TokenNumber); if (cnode.BadParsed) { Node node = new Node(); node.BadParsed = true; node.ErrorLine = Math.Max(Math.Max(VariableNode.ErrorLine, anode.ErrorLine), Math.Max(LoopNode.ErrorLine, IfNode.ErrorLine)); node.ErrorLine = Math.Max(Math.Max(ReturnNode.ErrorLine, cnode.ErrorLine), node.ErrorLine); //deepest parsing error BodyNodes.Add(node); return(BodyNodes); } BodyNodes.Add(cnode); TokenNumber = cnode.TokenNumber; if (TokenNumber >= Parser.TokensArray.Length) //if tokens ended { Node node = new Node(); node.BadParsed = true; node.ErrorLine = Parser.TokensArray[Parser.TokensArray.Length - 1].Line; return(BodyNodes); } } }
public void SetCall(CallNode call) { this.call = call; }
public static CallNode parse(int TokenNumber) { CallNode node = new CallNode(); if ((Parser.NeededToken(TokenNumber, "type", "name", 0) || Parser.NeededToken(TokenNumber, "value", "this", 0)) && Parser.NeededToken(TokenNumber + 1, "value", ".", 0)) { node.SetCallerName(Parser.TokensArray[TokenNumber].Value); TokenNumber += 2; } while (true) { string CurrentCallee = ""; List <ExpressionNode> arguments = new List <ExpressionNode>(); if (!Parser.NeededToken(TokenNumber, "type", "name", 0)) { node.BadParsed = true; node.ErrorLine = Parser.TokensArray[Math.Min(Parser.TokensArray.Length - 1, TokenNumber)].Line; return(node); } CurrentCallee = Parser.TokensArray[TokenNumber].Value; TokenNumber++; if (Parser.NeededToken(TokenNumber, "value", "(", 0)) { TokenNumber++; while (true) { ExpressionNode enode = ExpressionParser.parse(TokenNumber); if (enode.BadParsed) { node.BadParsed = true; node.ErrorLine = enode.ErrorLine; return(node); } TokenNumber = enode.TokenNumber; arguments.Add(enode); if (Parser.NeededToken(TokenNumber, "value", ",", 0)) { TokenNumber++; continue; } if (Parser.NeededToken(TokenNumber, "value", ")", 0)) { TokenNumber++; break; } node.BadParsed = true; node.ErrorLine = Parser.TokensArray[Math.Min(Parser.TokensArray.Length - 1, TokenNumber)].Line; return(node); } } node.AddCallee(CurrentCallee, arguments); if (Parser.NeededToken(TokenNumber, "value", ".", 0)) { TokenNumber++; continue; } break; } node.TokenNumber = TokenNumber; return(node); }