Improved test

This commit is contained in:
Martino Ferrari
2026-02-02 15:20:41 +01:00
parent d2b2750833
commit b879766021
9 changed files with 386 additions and 19 deletions

View File

@@ -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
}

View File

@@ -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}