diff --git a/pkg/gcs/ast/lex.go b/pkg/gcs/ast/lex.go index bbde0fceda..4634402f62 100644 --- a/pkg/gcs/ast/lex.go +++ b/pkg/gcs/ast/lex.go @@ -198,16 +198,6 @@ func lexText(l *lexer) stateFn { l.backup() return lexNumber case r == '-': - // if next item is a number then lex number - n := l.next() - if isNumeric(n) { - // backup twice - l.backup() - l.backup() - return lexNumber - } - // other wise it's a - sign - l.backup() l.emit(ItemMinus) case r == '>': if n := l.next(); n == '=' { @@ -409,11 +399,6 @@ func isAlphaNumeric(r rune) bool { return r == '_' || r == '-' || unicode.IsLetter(r) || unicode.IsDigit(r) || r == '%' } -// is Numeric reports whether r is a digit -func isNumeric(r rune) bool { - return unicode.IsDigit(r) -} - // atTerminator reports whether the input is at valid termination character to // appear after an identifier. Breaks .X.Y into two pieces. Also catches cases // like "$x+2" not being acceptable without a space, in case we decide one diff --git a/pkg/gcs/ast/lex_test.go b/pkg/gcs/ast/lex_test.go index fbff67044c..ec1e315fef 100644 --- a/pkg/gcs/ast/lex_test.go +++ b/pkg/gcs/ast/lex_test.go @@ -157,7 +157,8 @@ func TestBasicToken(t *testing.T) { // end for {Typ: itemRightBrace, Val: "}"}, // misc tests - {Typ: itemNumber, Val: "-1"}, + {Typ: ItemMinus, Val: "-"}, + {Typ: itemNumber, Val: "1"}, {Typ: itemNumber, Val: "1"}, {Typ: ItemMinus, Val: "-"}, {Typ: ItemMinus, Val: "-"}, diff --git a/pkg/gcs/op.go b/pkg/gcs/op.go index fa5c715f23..760471b187 100644 --- a/pkg/gcs/op.go +++ b/pkg/gcs/op.go @@ -71,19 +71,27 @@ func neq(l, r *number) *number { } func add(l, r *number) *number { - return &number{ - ival: l.ival + r.ival, - fval: l.fval + r.fval, + n := &number{ isFloat: l.isFloat || r.isFloat, } + if n.isFloat { + n.fval = ntof(l) + ntof(r) + } else { + n.ival = l.ival + r.ival + } + return n } func mul(l, r *number) *number { - return &number{ - ival: l.ival * r.ival, - fval: l.fval * r.fval, + n := &number{ isFloat: l.isFloat || r.isFloat, } + if n.isFloat { + n.fval = ntof(l) * ntof(r) + } else { + n.ival = l.ival * r.ival + } + return n } func div(l, r *number) *number { @@ -99,9 +107,13 @@ func div(l, r *number) *number { } func sub(l, r *number) *number { - return &number{ - ival: l.ival - r.ival, - fval: l.fval - r.fval, + n := &number{ isFloat: l.isFloat || r.isFloat, } + if n.isFloat { + n.fval = ntof(l) - ntof(r) + } else { + n.ival = l.ival - r.ival + } + return n } diff --git a/pkg/gcs/sysfunc.go b/pkg/gcs/sysfunc.go index 2fcf695827..2434bd3b6b 100644 --- a/pkg/gcs/sysfunc.go +++ b/pkg/gcs/sysfunc.go @@ -655,7 +655,7 @@ func (e *Eval) executeAction(c *ast.CallExpr, env *Env) (Obj, error) { if v.Typ() != typNum { return nil, fmt.Errorf("map params should evaluate to a number, got %v", v.Inspect()) } - params[k] = int(v.(*number).ival) + params[k] = int(ntof(v.(*number))) } charKey := keys.Char(char.ival)