private ASTStatementBase ParseWhile() { Require(TokenType.WHILE); Require(TokenType.LEFT_PARENTHESIS); ASTExpressionBase condition = ParseExpression(); Require(TokenType.RIGHT_PARENTHESIS); _loopLevel++; ASTStatementBase body = ParseStatement(); _loopLevel--; return(new ASTWhile(condition, body)); }
private void DeclareFunction(List <ASTFunctionBase> functionDeclarations) { var name = Require(TokenType.IDENTIFIER).Text; var baseClass = ""; if (Match(TokenType.DOUBLE_COLON)) { Consume(); baseClass = Require(TokenType.IDENTIFIER).Text; var tmp = baseClass; baseClass = name; name = tmp; } Require(TokenType.LEFT_PARENTHESIS); List <string> arguments = new List <string>(); while (!Match(TokenType.RIGHT_PARENTHESIS)) { arguments.Add(Require(TokenType.IDENTIFIER).Text); if (Match(TokenType.COMMA)) { Consume(); if (!Match(TokenType.IDENTIFIER)) { throw new ParserException($"Argument name is expected following a comma.", _lexer.Line, _lexer.Character); } } } Require(TokenType.RIGHT_PARENTHESIS); ASTStatementBase body = ParseBlock(); if (baseClass.Length != 0) { functionDeclarations.Add(new ASTMemberFunction(name, baseClass, arguments, body)); } else { functionDeclarations.Add(new ASTGlobalFunction(name, arguments, body)); } }
private ASTStatementBase ParseFor() { Require(TokenType.FOR); Require(TokenType.LEFT_PARENTHESIS); ASTExpressionBase initializer = ParseExpression(); Require(TokenType.SEMICOLON); ASTExpressionBase condition = ParseExpression(); Require(TokenType.SEMICOLON); ASTExpressionBase incrementer = ParseExpression(); Require(TokenType.RIGHT_PARENTHESIS); _loopLevel++; ASTStatementBase body = ParseStatement(); _loopLevel--; return(new ASTFor(initializer, condition, incrementer, body)); }
private ASTStatementBase ParseIf() { Require(TokenType.IF); Require(TokenType.LEFT_PARENTHESIS); ASTExpressionBase condition = ParseExpression(); Require(TokenType.RIGHT_PARENTHESIS); ASTStatementBase ifPart = ParseStatement(); ASTStatementBase elsePart = null; if (Match(TokenType.ELSE)) { Consume(); elsePart = ParseStatement(); } if (elsePart == null) { return(new ASTIf(condition, ifPart)); } return(new ASTIf(condition, ifPart, elsePart)); }