Esempio n. 1
0
File: Parser.cs Progetto: Stu042/Cy
    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));
    }
Esempio n. 2
0
File: Parser.cs Progetto: Stu042/Cy
    /// <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));
    }
Esempio n. 3
0
 public object VisitTypeStmt(Stmt.StmtType stmt, object options)
 {
     return(stmt.token.lexeme);
 }
Esempio n. 4
0
 public object VisitTypeStmt(Stmt.StmtType stmt, object options = null)
 {
     return(stmt.info);
 }