Improved test
This commit is contained in:
@@ -255,24 +255,7 @@ func (b *Builder) compute(left parser.Value, op parser.Token, right parser.Value
|
||||
return &parser.StringValue{Value: s1 + s2, Quoted: true}
|
||||
}
|
||||
|
||||
lF, lIsF := b.valToFloat(left)
|
||||
rF, rIsF := b.valToFloat(right)
|
||||
|
||||
if lIsF || rIsF {
|
||||
res := 0.0
|
||||
switch op.Type {
|
||||
case parser.TokenPlus:
|
||||
res = lF + rF
|
||||
case parser.TokenMinus:
|
||||
res = lF - rF
|
||||
case parser.TokenStar:
|
||||
res = lF * rF
|
||||
case parser.TokenSlash:
|
||||
res = lF / rF
|
||||
}
|
||||
return &parser.FloatValue{Value: res, Raw: fmt.Sprintf("%g", res)}
|
||||
}
|
||||
|
||||
// Try Integer arithmetic first
|
||||
lI, lIsI := b.valToInt(left)
|
||||
rI, rIsI := b.valToInt(right)
|
||||
|
||||
@@ -303,6 +286,25 @@ func (b *Builder) compute(left parser.Value, op parser.Token, right parser.Value
|
||||
return &parser.IntValue{Value: res, Raw: fmt.Sprintf("%d", res)}
|
||||
}
|
||||
|
||||
// Fallback to Float arithmetic
|
||||
lF, lIsF := b.valToFloat(left)
|
||||
rF, rIsF := b.valToFloat(right)
|
||||
|
||||
if lIsF || rIsF {
|
||||
res := 0.0
|
||||
switch op.Type {
|
||||
case parser.TokenPlus:
|
||||
res = lF + rF
|
||||
case parser.TokenMinus:
|
||||
res = lF - rF
|
||||
case parser.TokenStar:
|
||||
res = lF * rF
|
||||
case parser.TokenSlash:
|
||||
res = lF / rF
|
||||
}
|
||||
return &parser.FloatValue{Value: res, Raw: fmt.Sprintf("%g", res)}
|
||||
}
|
||||
|
||||
return left
|
||||
}
|
||||
|
||||
|
||||
@@ -319,6 +319,13 @@ func (p *Parser) parseAtom() (Value, bool) {
|
||||
}
|
||||
return val, true
|
||||
}
|
||||
if tok.Value == "!" {
|
||||
val, ok := p.parseAtom()
|
||||
if !ok {
|
||||
return nil, false
|
||||
}
|
||||
return &UnaryExpression{Position: tok.Position, Operator: tok, Right: val}, true
|
||||
}
|
||||
fallthrough
|
||||
case TokenLBrace:
|
||||
arr := &ArrayValue{Position: tok.Position}
|
||||
|
||||
Reference in New Issue
Block a user