calculate evaluate basic arithmetic operations.
(opdStack *Stack, opt efp.Token)
| 1335 | |
| 1336 | // calculate evaluate basic arithmetic operations. |
| 1337 | func calculate(opdStack *Stack, opt efp.Token) error { |
| 1338 | if opt.TValue == "-" && opt.TType == efp.TokenTypeOperatorPrefix { |
| 1339 | if opdStack.Len() < 1 { |
| 1340 | return ErrInvalidFormula |
| 1341 | } |
| 1342 | opd := opdStack.Pop().(formulaArg) |
| 1343 | opdStack.Push(newNumberFormulaArg(0 - opd.ToNumber().Number)) |
| 1344 | } |
| 1345 | if opt.TValue == "-" && opt.TType == efp.TokenTypeOperatorInfix { |
| 1346 | if opdStack.Len() < 2 { |
| 1347 | return ErrInvalidFormula |
| 1348 | } |
| 1349 | rOpd := opdStack.Pop().(formulaArg) |
| 1350 | lOpd := opdStack.Pop().(formulaArg) |
| 1351 | if err := calcSubtract(rOpd, lOpd, opdStack); err != nil { |
| 1352 | return err |
| 1353 | } |
| 1354 | } |
| 1355 | tokenCalcFunc := map[string]func(rOpd, lOpd formulaArg, opdStack *Stack) error{ |
| 1356 | "^": calcPow, |
| 1357 | "*": calcMultiply, |
| 1358 | "/": calcDiv, |
| 1359 | "+": calcAdd, |
| 1360 | "=": calcEq, |
| 1361 | "<>": calcNEq, |
| 1362 | "<": calcL, |
| 1363 | "<=": calcLe, |
| 1364 | ">": calcG, |
| 1365 | ">=": calcGe, |
| 1366 | "&": calcSplice, |
| 1367 | } |
| 1368 | if fn, ok := tokenCalcFunc[opt.TValue]; ok { |
| 1369 | if opdStack.Len() < 2 { |
| 1370 | return ErrInvalidFormula |
| 1371 | } |
| 1372 | rOpd := opdStack.Pop().(formulaArg) |
| 1373 | lOpd := opdStack.Pop().(formulaArg) |
| 1374 | if opt.TValue != "&" { |
| 1375 | if rOpd.Value() == "" { |
| 1376 | rOpd = newNumberFormulaArg(0) |
| 1377 | } |
| 1378 | if lOpd.Value() == "" { |
| 1379 | lOpd = newNumberFormulaArg(0) |
| 1380 | } |
| 1381 | } |
| 1382 | if rOpd.Type == ArgError { |
| 1383 | return errors.New(rOpd.Value()) |
| 1384 | } |
| 1385 | if lOpd.Type == ArgError { |
| 1386 | return errors.New(lOpd.Value()) |
| 1387 | } |
| 1388 | return fn(rOpd, lOpd, opdStack) |
| 1389 | } |
| 1390 | return nil |
| 1391 | } |
| 1392 | |
| 1393 | // parseOperatorPrefixToken parse operator prefix token. |
| 1394 | func (f *File) parseOperatorPrefixToken(optStack, opdStack *Stack, token efp.Token) (err error) { |
no test coverage detected