mirror of
https://github.com/unidoc/unioffice.git
synced 2025-04-27 13:48:54 +08:00

- ABS - ACOS - ACOSH - ARABIC - ASIN - ASINH - ATAN - ATANH - ATAN2 - BASE - CEILING.MATH - CEILING.PRECISE - COMBIN - COMBINA - COS - COSH - DECIMAL - DEGREES - PI
48 lines
959 B
Go
48 lines
959 B
Go
// Copyright 2017 Baliance. All rights reserved.
|
|
//
|
|
// Use of this source code is governed by the terms of the Affero GNU General
|
|
// Public License version 3.0 as published by the Free Software Foundation and
|
|
// appearing in the file LICENSE included in the packaging of this file. A
|
|
// commercial license can be purchased by contacting sales@baliance.com.
|
|
|
|
package formula
|
|
|
|
import (
|
|
"io"
|
|
"log"
|
|
"strings"
|
|
)
|
|
|
|
//go:generate goyacc -l -o grammar.go grammar.y
|
|
type plex struct {
|
|
nodes chan *node
|
|
result Expression
|
|
}
|
|
|
|
func (f *plex) Lex(lval *yySymType) int {
|
|
//yyDebug = 3
|
|
n := <-f.nodes
|
|
if n != nil {
|
|
lval.node = n
|
|
return int(lval.node.token)
|
|
}
|
|
return 0
|
|
}
|
|
|
|
func (f *plex) Error(s string) {
|
|
log.Printf("parse error: %s", s)
|
|
}
|
|
|
|
func Parse(r io.Reader) Expression {
|
|
p := &plex{LexReader(r), nil}
|
|
yyParse(p)
|
|
return p.result
|
|
}
|
|
|
|
func ParseString(s string) Expression {
|
|
if s == "" {
|
|
return NewEmptyExpr()
|
|
}
|
|
return Parse(strings.NewReader(s))
|
|
}
|