public static WhileBlock Parse(ContextNode context, IAbstractSyntaxTree lexerNode) { Contract.Requires(lexerNode.Type == TokenType.WhileLoop); var point = context.Parser.GetSequencePoint(lexerNode); var condition = ExpressionNode.Parse(context, lexerNode.Children[2]); var block = CodeBlockNode.Parse(context, lexerNode.Children[4]); return(Create(context, condition, block, point)); }
public void Emit() { parsedBody = CodeBlockNode.Parse(this, body); if (MethodReturnType.FullName != Parser.Void.FullName && !parsedBody.Returns) { ErrorCode.MissingReturn.ReportAndThrow(SequencePoint, "Not all control paths return a value"); } if (Parser.ProjectParser.ShouldEmit) { emitter.ParseTree(parsedBody); } }
public static ConditionBlockNode Parse(ContextNode context, IAbstractSyntaxTree lexerNode) { Contract.Requires(lexerNode.Type == TokenType.ConditionalSentence); Contract.Ensures(Contract.Result <ConditionBlockNode>() != null); var point = context.Parser.GetSequencePoint(lexerNode); var condition = ExpressionNode.Parse(context, lexerNode.Children[2]); var trueBlock = CodeBlockNode.Parse(context, lexerNode.Children[4]); CodeBlockNode falseBlock = null; if (lexerNode.Children.Count > 5) { falseBlock = CodeBlockNode.Parse(context, lexerNode.Children[6]); } return(Create(context, condition, trueBlock, falseBlock, point)); }
public CodeBlockNode AddNode(IAbstractSyntaxTree lexerNode) { switch (lexerNode.Type) { case Lexer.TokenType.WhileLoop: return(AddNode(WhileBlock.Parse(this, lexerNode))); case Lexer.TokenType.ConditionalSentence: return(AddNode(ConditionBlockNode.Parse(this, lexerNode))); case Lexer.TokenType.CodeBlockNode: return(AddNode(CodeBlockNode.Parse(this, lexerNode))); case Lexer.TokenType.ForLoop: return(AddNode(ForLoopNode.Parse(this, lexerNode))); case Lexer.TokenType.ForEachLoop: return(AddNode(ForEachNode.Parse(this, lexerNode))); case Lexer.TokenType.StatementWithEndOfLine: if (lexerNode.Children.Count == 2) { return(AddStatement(lexerNode.Children[0])); } else { //empty statement a.k.a ";" return(this); } case Lexer.TokenType.UnknownNode: ErrorCode.InvalidStructure.ReportAndThrow(Parser.GetSequencePoint(lexerNode), "Could not parse as a statement"); return(null); //unreachable default: ErrorCode.InvalidStructure.ReportAndThrow(Parser.GetSequencePoint(lexerNode), "Unexpected node {0} in while parsing code block", lexerNode.Type); return(null); //unreachable } }
public static ForEachNode Parse(ContextNode context, IAbstractSyntaxTree lexerNode) { //For + LeftParenthesis + ForEachDeclaration + In + Value + RightParenthesis + CodeConstruct), Contract.Requires(lexerNode.Type == Lexer.TokenType.ForEachLoop); var instance = new ForEachNode(context, context.Parser.GetSequencePoint(lexerNode)); var collection = ExpressionNode.Parse(context, lexerNode.Children[4]); if (!collection.IsGettable) { ErrorCode.NotAnRValue.ReportAndThrow(collection.SequencePoint, "collection must be a gettable expression"); } if (collection.ExpressionReturnType.IsTypeless()) { ErrorCode.InvalidForEachCollection.ReportAndThrow(collection.SequencePoint, "collection must not be a typeless expression"); } var collectionElementType = collection.ExpressionReturnType.GetEnumerableElementType(); if (collectionElementType == null) { ErrorCode.InvalidForEachCollection.ReportAndThrow(collection.SequencePoint, "Cannot iterate over expression type {0}", collection.ExpressionReturnType); } var declaration = LoopVariableDeclaration.Parse(context, lexerNode.Children[2], collectionElementType); if (!collectionElementType.IsAssignableTo(declaration.Variable.VariableType)) { ErrorCode.TypeMismatch.ReportAndThrow(declaration.SequencePoint, "Cannot assign collection elements of type {0} to {1}", collectionElementType, declaration.Variable.VariableType); } instance.collection = collection; instance.variable = declaration; instance.body = CodeBlockNode.Parse(instance, lexerNode.Children[6]); return(instance); }
public static ParserNode Parse(ContextNode context, IAbstractSyntaxTree lexerNode) { Contract.Requires(context != null); CodeBlockNode init = null; ExpressionNode condition = null; CodeBlockNode increment = null; IAbstractSyntaxTree initNode = lexerNode.Children[2]; IAbstractSyntaxTree conditionNode = lexerNode.Children[4]; IAbstractSyntaxTree incrementNode = lexerNode.Children[6]; IAbstractSyntaxTree bodyNode = lexerNode.Children[8]; if (initNode.Type != TokenType.Empty) { init = CodeBlockNode.Create(context, context.Parser.GetSequencePoint(initNode)); init.AddStatement(initNode); //makes init scope encompass for scope context = init; } if (conditionNode.Type != TokenType.Empty) { condition = ExpressionNode.Parse(context, conditionNode, context.Parser.Bool); } if (incrementNode.Type != TokenType.Empty) { increment = CodeBlockNode.Create(context, context.Parser.GetSequencePoint(incrementNode)); increment.AddStatement(incrementNode); } var body = CodeBlockNode.Parse(context, bodyNode); return(ForLoopNode.Create(context, init, condition, increment, body, context.Parser.GetSequencePoint(lexerNode))); }