MCPcopy
hub / github.com/qax-os/excelize / parseToken

Method parseToken

calc.go:1486–1526  ·  view source on GitHub ↗

parseToken parse basic arithmetic operator priority and evaluate based on operators and operands.

(ctx *calcContext, sheet string, token efp.Token, opdStack, optStack *Stack)

Source from the content-addressed store, hash-verified

1484// parseToken parse basic arithmetic operator priority and evaluate based on
1485// operators and operands.
1486func (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.
1529func parseRef(ref string) (cellRef, bool, bool, error) {

Callers 2

evalInfixExpMethod · 0.95
TestParseTokenFunction · 0.95

Calls 15

getDefinedNameRefToMethod · 0.95
parseReferenceMethod · 0.95
formulaArgToTokenFunction · 0.85
isOperatorPrefixTokenFunction · 0.85
isBeginParenthesesTokenFunction · 0.85
isEndParenthesesTokenFunction · 0.85
calculateFunction · 0.85
newNumberFormulaArgFunction · 0.85
isOperandFunction · 0.85
tokenToFormulaArgFunction · 0.85
PushMethod · 0.80

Tested by 1

TestParseTokenFunction · 0.76