comptime eval
This commit is contained in:
+32
-18
@@ -914,7 +914,7 @@ is_simple_range_bound :: proc(expr: ast.Expr) -> bool {
|
||||
|
||||
prefix_binding_power :: proc(kind: token.Kind) -> (right: int, ok: bool) {
|
||||
#partial switch kind {
|
||||
case .Minus, .Ampersand, .Bang, .Keyword_Try:
|
||||
case .Minus, .Ampersand, .Bang, .Dollar, .Keyword_Try:
|
||||
return 20, true
|
||||
}
|
||||
return 0, false
|
||||
@@ -931,24 +931,38 @@ parse_expression_bp :: proc(parser: ^Parser, minimum_binding_power, nesting: int
|
||||
left := ast.INVALID_EXPR
|
||||
if right_power, ok := prefix_binding_power(current(parser).kind); ok {
|
||||
operator := advance(parser)
|
||||
if parser.delimiter_depth > 0 {
|
||||
skip_newlines(parser)
|
||||
if operator.kind == .Dollar && current(parser).kind == .Left_Brace {
|
||||
body := parse_block(parser)
|
||||
end := previous(parser)
|
||||
left = add_expr(parser, ast.Expr{
|
||||
kind = .Comptime,
|
||||
span = span_from(operator.span, end.span),
|
||||
body = body,
|
||||
left = ast.INVALID_EXPR,
|
||||
right = ast.INVALID_EXPR,
|
||||
diagnostic = source.INVALID_DIAGNOSTIC,
|
||||
})
|
||||
} else {
|
||||
if parser.delimiter_depth > 0 {
|
||||
skip_newlines(parser)
|
||||
}
|
||||
operand := parse_expression_bp(parser, right_power, nesting+1)
|
||||
operand_expr := parser.module.exprs[operand]
|
||||
prefix_kind := ast.Expr_Kind.Negate
|
||||
#partial switch operator.kind {
|
||||
case .Ampersand: prefix_kind = .Address
|
||||
case .Bang: prefix_kind = .Not
|
||||
case .Dollar: prefix_kind = .Comptime
|
||||
case .Keyword_Try: prefix_kind = .Try
|
||||
}
|
||||
left = add_expr(parser, ast.Expr{
|
||||
kind = prefix_kind,
|
||||
span = span_from(operator.span, operand_expr.span),
|
||||
left = operand,
|
||||
right = ast.INVALID_EXPR,
|
||||
diagnostic = source.INVALID_DIAGNOSTIC,
|
||||
})
|
||||
}
|
||||
operand := parse_expression_bp(parser, right_power, nesting+1)
|
||||
operand_expr := parser.module.exprs[operand]
|
||||
prefix_kind := ast.Expr_Kind.Negate
|
||||
#partial switch operator.kind {
|
||||
case .Ampersand: prefix_kind = .Address
|
||||
case .Bang: prefix_kind = .Not
|
||||
case .Keyword_Try: prefix_kind = .Try
|
||||
}
|
||||
left = add_expr(parser, ast.Expr{
|
||||
kind=prefix_kind,
|
||||
span=span_from(operator.span, operand_expr.span),
|
||||
left=operand,
|
||||
right=ast.INVALID_EXPR,
|
||||
diagnostic=source.INVALID_DIAGNOSTIC,
|
||||
})
|
||||
} else {
|
||||
left = parse_primary(parser, nesting)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user