Exemple #1
0
        internal NameExpr ParseQualifiedName()
        {
            NameExpr n = ParseName();

            while (La() == TokenType.DOT && (La(2) == TokenType.ID || TokenAttr.IsSoftKeyword(La(2))))
            {
                Consume();
                n = new QualifiedNameExpr(n, ParseName());
            }
            return(n);
        }
Exemple #2
0
        internal NameExpr ParseName()
        {
            NameExpr n = ParseId();

            if (n != null)
            {
                // TODO nvk: Parse generic arguments
            }

            return(n);
        }
Exemple #3
0
 internal static CompilationError LookupError(Expr expr, NameExpr name)
 {
     if (expr.Symbol is NamespaceSymbol)
     {
         return(name.Error(ErrorCode.TypeNotFoundInNamespace, name.Name, expr));
     }
     if (expr.Symbol is TypeSymbol)
     {
         return(name.Error(ErrorCode.MemberNotFoundInType, name.Name, expr));
     }
     return(name.Error(ErrorCode.NotTypeOrNamespace, expr));
 }
Exemple #4
0
        // <-- Name
        //   | FN Name TupleType
        //   | BOOL_LITERAL
        //   | INT_LITERAL
        //   | STRING_LITERAL
        //   | LPAREN (Expression)? RPAREN
        private IUnboundExpr PrimaryExpr()
        {
            IUnboundExpr expression;

            if (CurrentIs(TokenType.Name))
            {
                var name = Consume();
                expression = new NameExpr(name.Position, name.StringValue, TypeArgs());
            }
            else if (CurrentIs(TokenType.Fn)) expression = FuncExpr();
            else if (CurrentIs(TokenType.Bool)) expression = new BoolExpr(Consume(TokenType.Bool));
            else if (CurrentIs(TokenType.Int)) expression = new IntExpr(Consume(TokenType.Int));
            else if (CurrentIs(TokenType.String)) expression = new StringExpr(Consume(TokenType.String));
            else if (CurrentIs(TokenType.LeftParen))
            {
                Token leftParen = Consume(TokenType.LeftParen);

                if (CurrentIs(TokenType.RightParen))
                {
                    // () -> unit
                    expression = new UnitExpr(leftParen.Position);
                }
                else if (CurrentIs(TokenType.Operator))
                {
                    // ( OPERATOR ) -> an operator in prefix form
                    Token op = Consume(TokenType.Operator);
                    expression = new NameExpr(op.Position, op.StringValue);
                }
                else
                {
                    // anything else is a regular parenthesized expression
                    expression = Expression();
                }

                Consume(TokenType.RightParen);
            }
            else expression = null;

            return expression;
        }
Exemple #5
0
        // <-- FN ((Name | Operator) TupleType)
        //      | (LPAREN ParamDecl RPAREN)
        private IUnboundExpr FuncExpr()
        {
            Position position = Consume(TokenType.Fn).Position;

            if (CurrentIs(TokenType.LeftParen))
            {
                // local function
                var paramNames = new List<string>();
                var funcType = FnArgsDecl(paramNames);
                var body = Block();

                return new LocalFuncExpr(position, paramNames, funcType, body);
            }
            else
            {
                // function reference
                NameExpr name;
                if (CurrentIs(TokenType.Operator))
                {
                    Token op = Consume(TokenType.Operator);
                    name = new NameExpr(op.Position, op.StringValue);
                }
                else
                {
                    var token = Consume(TokenType.Name);
                    name = new NameExpr(token.Position, token.StringValue, TypeArgs());
                }

                var parameters = TupleType().ToArray();
                IUnboundDecl parameter;
                if (parameters.Length == 0)
                {
                    parameter = Decl.Unit;
                }
                else if (parameters.Length == 1)
                {
                    parameter = parameters[0];
                }
                else
                {
                    parameter = new TupleType(parameters);
                }

                return new FuncRefExpr(position, name, parameter);
            }
        }