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); }
internal NameExpr ParseName() { NameExpr n = ParseId(); if (n != null) { // TODO nvk: Parse generic arguments } return(n); }
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)); }
// <-- 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; }
// <-- 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); } }