public ASTNode Parse(Token sourceToken, ParseContext context) { context.Expect(TokenType.OpenParenthesis); var condition = context.ParseExpression(); context.Expect(TokenType.CloseParenthesis); ASTNode body = context.ParseStatement(); return(new WhileNode(sourceToken, condition, body)); }
public ASTNode Parse(Token sourceToken, ParseContext context) { var id = context.ParseExpression <IdentifierNode>(); context.Expect(TokenType.Colon); var type = TypeIdentifierNode.Parse(context); context.Expect(TokenType.Equals); ASTNode assignment = context.ParseExpression(); return(new ConstDeclarationNode(sourceToken, id, type, assignment)); }
public ASTNode Parse(Token sourceToken, ParseContext context) { context.Expect(TokenType.OpenAngleBracket); TypeIdentifierNode toType = TypeIdentifierNode.Parse(context); context.Expect(TokenType.CloseAngleBracket); context.Expect(TokenType.OpenParenthesis); ASTNode castExpr = context.ParseExpression(); context.Expect(TokenType.CloseParenthesis); return(new CastNode(sourceToken, toType, castExpr)); }
public ASTNode Parse(Token sourceToken, ParseContext context) { context.Expect(TokenType.OpenParenthesis); IdentifierNode identifier = new IdentifierNode(context.Expect(TokenType.Identifier)); context.Expect(TokenType.In); ASTNode rangeExpr = context.ParseExpression(); context.Expect(TokenType.CloseParenthesis); ASTNode body = context.ParseStatement(); return(new ForNode(sourceToken, identifier, rangeExpr, body)); }
public ASTNode Parse(Token sourceToken, ParseContext context) { ASTNode body = context.ParseStatement(); ASTNode condition = null; if (context.TryMatch(TokenType.While)) { context.Expect(TokenType.OpenParenthesis); condition = context.ParseExpression(); context.Expect(TokenType.CloseParenthesis); context.Expect(TokenType.Semicolon); } return(new DoNode(sourceToken, condition, body)); }
public static TypeIdentifierNode Parse(ParseContext context) { bool isReference = context.TryMatch(TokenType.Ampersand); IdentifierNode typeID = context.ParseExpression <IdentifierNode>(); IdentifierNode moduleID = null; if (context.TryMatch(TokenType.Dot)) { moduleID = typeID; typeID = context.ParseExpression <IdentifierNode>(); } int pointerLevel = 0; while (context.TryMatch(TokenType.Asterisk)) { pointerLevel++; } bool isArray = false; ASTNode arraySizeExpr = null; if (context.TryMatch(TokenType.OpenBracket)) { isArray = true; if (!context.TryMatch(TokenType.CloseBracket)) { arraySizeExpr = context.ParseExpression(); context.Expect(TokenType.CloseBracket); } } return(new TypeIdentifierNode(typeID.Source, typeID, moduleID, isReference, pointerLevel, isArray, arraySizeExpr)); }
public ASTNode Parse(ASTNode lhs, Token sourceToken, ParseContext context) { var indexer = context.ParseExpression(); context.Expect(TokenType.CloseBracket); return(new IndexNode(sourceToken, lhs, indexer)); }
public ASTNode Parse(Token sourceToken, ParseContext context) { context.Expect(TokenType.OpenParenthesis); var condition = context.ParseExpression(); context.Expect(TokenType.CloseParenthesis); ASTNode body = context.ParseStatement(); ASTNode elseBody = null; if (context.TryMatch(TokenType.Else)) { elseBody = context.ParseStatement(); } return(new IfNode(sourceToken, condition, body, elseBody)); }
public ASTNode Parse(Token sourceToken, ParseContext context) { var inner = context.ParseExpression(); context.Expect(TokenType.CloseParenthesis); return(new GroupNode(sourceToken, inner)); }
public static FunctionParameterNode Parse(ParseContext context) { // todo: support "ref" var id = context.ParseExpression <IdentifierNode>(); context.Expect(TokenType.Colon); var type = TypeIdentifierNode.Parse(context); return(new FunctionParameterNode(id.Source, id, type)); }