parser: fix prefix precedence

pull/4293/head
Alexander Medvednikov 2020-04-08 13:53:11 +02:00
parent c00ec77737
commit eb78396307
5 changed files with 39 additions and 34 deletions

View File

@ -29,6 +29,8 @@ fn test_float_equal_operator() {
assert a.gtbit(1) assert a.gtbit(1)
assert a >= 1 assert a >= 1
assert a.gebit(1) assert a.gebit(1)
assert -1 == 1 * -1
assert -1.0 == 1.0 * -1.0
a = f64(1) a = f64(1)
a += 0.000001 a += 0.000001

View File

@ -848,7 +848,7 @@ pub fn (c mut Checker) expr(node ast.Expr) table.Type {
type_sym := c.table.get_type_symbol(it.typ) type_sym := c.table.get_type_symbol(it.typ)
if expr_type_sym.kind == .sum_type { if expr_type_sym.kind == .sum_type {
info := expr_type_sym.info as table.SumType info := expr_type_sym.info as table.SumType
if !it.typ in info.variants { if !(it.typ in info.variants) {
c.error('cannot cast `$expr_type_sym.name` to `$type_sym.name`', it.pos) c.error('cannot cast `$expr_type_sym.name` to `$type_sym.name`', it.pos)
// c.error('only $info.variants can be casted to `$typ`', it.pos) // c.error('only $info.variants can be casted to `$typ`', it.pos)
} }

View File

@ -840,9 +840,9 @@ fn (g mut Gen) gen_fn_decl(it ast.FnDecl) {
g.writeln('free(_const_os__args.data); // empty, inited in _vinit()') g.writeln('free(_const_os__args.data); // empty, inited in _vinit()')
} }
if g.pref.os == .windows { if g.pref.os == .windows {
g.writeln('_const_os__args = os__init_os_args_wide(___argc, ___argv);') g.writeln('\t_const_os__args = os__init_os_args_wide(___argc, ___argv);')
} else { } else {
g.writeln('_const_os__args = os__init_os_args(___argc, (byteptr*)___argv);') g.writeln('\t_const_os__args = os__init_os_args(___argc, (byteptr*)___argv);')
} }
} }
} }
@ -1123,7 +1123,9 @@ fn (g mut Gen) expr(node ast.Expr) {
} }
// g.write('/*pref*/') // g.write('/*pref*/')
g.write(it.op.str()) g.write(it.op.str())
//g.write('(')
g.expr(it.right) g.expr(it.right)
//g.write(')')
g.is_amp = false g.is_amp = false
} }
ast.SizeOf { ast.SizeOf {
@ -1390,7 +1392,8 @@ fn (g mut Gen) infix_expr(node ast.InfixExpr) {
g.expr(node.right) g.expr(node.right)
g.write('), $tmp, $elem_type_str)') g.write('), $tmp, $elem_type_str)')
} }
} else if (node.left_type == node.right_type ) && node.left_type in [ table.f32_type_idx, table.f64_type_idx ] && node.op in [ .eq, .ne ] { } else if (node.left_type == node.right_type) && node.left_type in [table.f32_type_idx,
table.f64_type_idx] && node.op in [.eq, .ne] {
// floats should be compared with epsilon // floats should be compared with epsilon
if node.left_type == table.f64_type_idx { if node.left_type == table.f64_type_idx {
if node.op == .eq { if node.op == .eq {
@ -1398,7 +1401,7 @@ fn (g mut Gen) infix_expr(node ast.InfixExpr) {
} else { } else {
g.write('f64_ne(') g.write('f64_ne(')
} }
}else{ } else {
if node.op == .eq { if node.op == .eq {
g.write('f32_eq(') g.write('f32_eq(')
} else { } else {

View File

@ -863,7 +863,7 @@ fn (p mut Parser) prefix_expr() ast.PrefixExpr {
p.is_amp = true p.is_amp = true
} }
p.next() p.next()
right := p.expr(1) right := p.expr(token.Precedence.prefix)
p.is_amp = false p.is_amp = false
return ast.PrefixExpr{ return ast.PrefixExpr{
op: op op: op

View File

@ -303,7 +303,7 @@ pub enum Precedence {
product // * or / product // * or /
// mod // % // mod // %
prefix // -X or !X prefix // -X or !X
postfix postfix // ++ or --
call // func(X) or foo.method(X) call // func(X) or foo.method(X)
index // array[index], map[key] index // array[index], map[key]
} }