Stmt.Function ConstructorDeclaration() { Token name = _parserCursor.Advance(); string structorType; Stmt.StmtType returnType; if (name.lexeme[0] == '~') { structorType = "Destructor"; returnType = new Stmt.StmtType(new List <Token> { new Token("void", TokenType.VOID) }); } else { structorType = "Constructor"; returnType = new Stmt.StmtType(new List <Token> { new Token("void", TokenType.VOID) /*new Token(name.lexeme, name.tokenType)*/ }); } _parserCursor.Consume(TokenType.LEFT_PAREN, $"Expect opening bracket after {structorType} name."); List <Stmt.InputVar> parameters = new(); if (!_parserCursor.IsCheck(TokenType.RIGHT_PAREN)) { do { Token typeTok; if (_parserCursor.IsCheckAnyType()) { typeTok = _parserCursor.Advance(); } else { throw new ParserException(_parserCursor.Peek(), "Expect parameter type."); } Token id = _parserCursor.Consume(TokenType.IDENTIFIER, "Expect parameter name."); parameters.Add(new Stmt.InputVar(new Stmt.StmtType(new List <Token> { typeTok }), id)); } while (_parserCursor.IsMatch(TokenType.COMMA)); } _parserCursor.Consume(TokenType.RIGHT_PAREN, "Expect closing bracket after parameters."); _parserCursor.Consume(TokenType.COLON, $"Expect colon before {structorType} body."); _parserCursor.Consume(TokenType.NEWLINE, $"Expect 'newline' before {structorType} body."); var body = Block(); return(new Stmt.Function(returnType, name, parameters, body)); }
/// <summary>Declare a function/method.</summary> Stmt.Function FunDeclaration() { var returnType = new Stmt.StmtType(new List <Token> { _parserCursor.Advance() }); Token name = _parserCursor.Consume(TokenType.IDENTIFIER, "Expected function name."); _parserCursor.Consume(TokenType.LEFT_PAREN, "Expect open bracket after function name."); var parameters = new List <Stmt.InputVar>(); if (!_parserCursor.IsCheck(TokenType.RIGHT_PAREN)) { do { Token typeTok; if (_parserCursor.IsCheckAnyType()) { typeTok = _parserCursor.Advance(); } else { throw new ParserException(_parserCursor.Peek(), "Expect parameter type."); } Token id = _parserCursor.Consume(TokenType.IDENTIFIER, "Expect parameter name."); parameters.Add(new Stmt.InputVar(new Stmt.StmtType(new List <Token> { typeTok }), id)); } while (_parserCursor.IsMatch(TokenType.COMMA)); } _parserCursor.Consume(TokenType.RIGHT_PAREN, "Expect closing bracket after parameters."); _parserCursor.Consume(TokenType.COLON, "Expect colon before function body."); _parserCursor.Consume(TokenType.NEWLINE, "Expect newline before function body."); List <Stmt> body = Block(); return(new Stmt.Function(returnType, name, parameters, body)); }
public object VisitTypeStmt(Stmt.StmtType stmt, object options) { return(stmt.token.lexeme); }
public object VisitTypeStmt(Stmt.StmtType stmt, object options = null) { return(stmt.info); }