parseToken parse basic arithmetic operator priority and evaluate based on operators and operands.
(ctx *calcContext, sheet string, token efp.Token, opdStack, optStack *Stack)
| 1484 | // parseToken parse basic arithmetic operator priority and evaluate based on |
| 1485 | // operators and operands. |
| 1486 | func (f *File) parseToken(ctx *calcContext, sheet string, token efp.Token, opdStack, optStack *Stack) error { |
| 1487 | // parse reference: must reference at here |
| 1488 | if token.TSubType == efp.TokenSubTypeRange { |
| 1489 | refTo := f.getDefinedNameRefTo(token.TValue, sheet) |
| 1490 | if refTo != "" { |
| 1491 | token.TValue = refTo |
| 1492 | } |
| 1493 | result, err := f.parseReference(ctx, sheet, token.TValue) |
| 1494 | if err != nil { |
| 1495 | return errors.New(formulaErrorNAME) |
| 1496 | } |
| 1497 | token = formulaArgToToken(result) |
| 1498 | } |
| 1499 | if isOperatorPrefixToken(token) { |
| 1500 | if err := f.parseOperatorPrefixToken(optStack, opdStack, token); err != nil { |
| 1501 | return err |
| 1502 | } |
| 1503 | } |
| 1504 | if isBeginParenthesesToken(token) { // ( |
| 1505 | optStack.Push(token) |
| 1506 | } |
| 1507 | if isEndParenthesesToken(token) { // ) |
| 1508 | for !isBeginParenthesesToken(optStack.Peek().(efp.Token)) { // != ( |
| 1509 | topOpt := optStack.Peek().(efp.Token) |
| 1510 | if err := calculate(opdStack, topOpt); err != nil { |
| 1511 | return err |
| 1512 | } |
| 1513 | optStack.Pop() |
| 1514 | } |
| 1515 | optStack.Pop() |
| 1516 | } |
| 1517 | if token.TType == efp.TokenTypeOperatorPostfix && !opdStack.Empty() { |
| 1518 | topOpd := opdStack.Pop().(formulaArg) |
| 1519 | opdStack.Push(newNumberFormulaArg(topOpd.Number / 100)) |
| 1520 | } |
| 1521 | // opd |
| 1522 | if isOperand(token) { |
| 1523 | opdStack.Push(tokenToFormulaArg(token)) |
| 1524 | } |
| 1525 | return nil |
| 1526 | } |
| 1527 | |
| 1528 | // parseRef parse reference for a cell, column name or row number. |
| 1529 | func parseRef(ref string) (cellRef, bool, bool, error) { |