Skip to content

Commit

Permalink
fix evaluate of code
Browse files Browse the repository at this point in the history
  • Loading branch information
Stepan Pyzhov committed Mar 26, 2019
1 parent be16448 commit db2c579
Show file tree
Hide file tree
Showing 5 changed files with 155 additions and 91 deletions.
102 changes: 56 additions & 46 deletions buffer.go
Original file line number Diff line number Diff line change
Expand Up @@ -110,29 +110,19 @@ var (
}

operations = map[string]operation{
//"!": func(left *Node, right *Node) (result *Node, err error) {
// if right != nil {
// return nil, errorRequest("factorial MUST be called via one Node argument")
// }
// num, err := left.getUInteger()
// if err != nil {
// return
// }
// return varNode(left, "factorial", Numeric, float64(mathFactorial(num))), nil
//},
"**": func(left *Node, right *Node) (result *Node, err error) {
lnum, rnum, err := _floats(left, right)
if err != nil {
return
}
return varNode(left, "power", Numeric, math.Pow(lnum, rnum)), nil
return varNode(nil, "power", Numeric, math.Pow(lnum, rnum)), nil
},
"*": func(left *Node, right *Node) (result *Node, err error) {
lnum, rnum, err := _floats(left, right)
if err != nil {
return
}
return varNode(left, "multiply", Numeric, float64(lnum*rnum)), nil
return varNode(nil, "multiply", Numeric, float64(lnum*rnum)), nil
},
"/": func(left *Node, right *Node) (result *Node, err error) {
lnum, rnum, err := _floats(left, right)
Expand All @@ -142,7 +132,7 @@ var (
if rnum == 0 {
return nil, errorRequest("division by zero")
}
return varNode(left, "division", Numeric, float64(lnum/rnum)), nil
return varNode(nil, "division", Numeric, float64(lnum/rnum)), nil
},
"%": func(left *Node, right *Node) (result *Node, err error) {
lnum, err := left.getInteger()
Expand All @@ -153,7 +143,7 @@ var (
if err != nil {
return
}
return varNode(left, "remainder", Numeric, float64(lnum%rnum)), nil
return varNode(nil, "remainder", Numeric, float64(lnum%rnum)), nil
},
"<<": func(left *Node, right *Node) (result *Node, err error) {
lnum, err := left.getInteger()
Expand All @@ -164,7 +154,7 @@ var (
if err != nil {
return
}
return varNode(left, "left shift", Numeric, float64(lnum<<rnum)), nil
return varNode(nil, "left shift", Numeric, float64(lnum<<rnum)), nil
},
">>": func(left *Node, right *Node) (result *Node, err error) {
lnum, err := left.getInteger()
Expand All @@ -175,43 +165,43 @@ var (
if err != nil {
return
}
return varNode(left, "right shift", Numeric, float64(lnum>>rnum)), nil
return varNode(nil, "right shift", Numeric, float64(lnum>>rnum)), nil
},
"&": func(left *Node, right *Node) (result *Node, err error) {
lnum, rnum, err := _ints(left, right)
if err != nil {
return
}
return varNode(left, "bitwise AND", Numeric, float64(lnum&rnum)), nil
return varNode(nil, "bitwise AND", Numeric, float64(lnum&rnum)), nil
},
"&^": func(left *Node, right *Node) (result *Node, err error) {
lnum, rnum, err := _ints(left, right)
if err != nil {
return
}
return varNode(left, "bit clear (AND NOT)", Numeric, float64(lnum&rnum)), nil
return varNode(nil, "bit clear (AND NOT)", Numeric, float64(lnum&rnum)), nil
},
"+": func(left *Node, right *Node) (result *Node, err error) {
lnum, rnum, err := _floats(left, right)
if err != nil {
return
}
return varNode(left, "sum", Numeric, float64(lnum+rnum)), nil
return varNode(nil, "sum", Numeric, float64(lnum+rnum)), nil
},
"-": func(left *Node, right *Node) (result *Node, err error) {
lnum, rnum, err := _floats(left, right)
if err != nil {
return
}
return varNode(left, "sub", Numeric, float64(lnum-rnum)), nil
return varNode(nil, "sub", Numeric, float64(lnum-rnum)), nil
},
"|": func(left *Node, right *Node) (result *Node, err error) {
if left.IsNumeric() && right.IsNumeric() {
lnum, rnum, err := _ints(left, right)
if err != nil {
return nil, err
}
return varNode(left, "bitwise OR", Numeric, float64(lnum|rnum)), nil
return varNode(nil, "bitwise OR", Numeric, float64(lnum|rnum)), nil
}
return nil, errorRequest("function 'bitwise OR' was called from non numeric node")
},
Expand All @@ -221,7 +211,7 @@ var (
if err != nil {
return nil, err
}
return varNode(left, "bitwise XOR", Numeric, float64(lnum^rnum)), nil
return varNode(nil, "bitwise XOR", Numeric, float64(lnum^rnum)), nil
}
return nil, errorRequest("function 'bitwise XOR' was called from non numeric node")
},
Expand All @@ -230,42 +220,42 @@ var (
if err != nil {
return nil, err
}
return varNode(left, "eq", Bool, bool(res)), nil
return varNode(nil, "eq", Bool, bool(res)), nil
},
"!=": func(left *Node, right *Node) (result *Node, err error) {
res, err := left.Eq(right)
if err != nil {
return nil, err
}
return varNode(left, "neq", Bool, bool(!res)), nil
return varNode(nil, "neq", Bool, bool(!res)), nil
},
"<": func(left *Node, right *Node) (result *Node, err error) {
res, err := left.Le(right)
if err != nil {
return nil, err
}
return varNode(left, "le", Bool, bool(!res)), nil
return varNode(nil, "le", Bool, bool(!res)), nil
},
"<=": func(left *Node, right *Node) (result *Node, err error) {
res, err := left.Leq(right)
if err != nil {
return nil, err
}
return varNode(left, "leq", Bool, bool(!res)), nil
return varNode(nil, "leq", Bool, bool(!res)), nil
},
">": func(left *Node, right *Node) (result *Node, err error) {
res, err := left.Ge(right)
if err != nil {
return nil, err
}
return varNode(left, "ge", Bool, bool(!res)), nil
return varNode(nil, "ge", Bool, bool(!res)), nil
},
">=": func(left *Node, right *Node) (result *Node, err error) {
res, err := left.Geq(right)
if err != nil {
return nil, err
}
return varNode(left, "geq", Bool, bool(!res)), nil
return varNode(nil, "geq", Bool, bool(!res)), nil
},
"&&": func(left *Node, right *Node) (result *Node, err error) {
res := false
Expand All @@ -280,7 +270,7 @@ var (
}
res = rval
}
return varNode(left, "AND", Bool, bool(!res)), nil
return varNode(nil, "AND", Bool, bool(!res)), nil
},
"||": func(left *Node, right *Node) (result *Node, err error) {
res := true
Expand All @@ -295,7 +285,7 @@ var (
}
res = rval
}
return varNode(left, "OR", Bool, bool(!res)), nil
return varNode(nil, "OR", Bool, bool(!res)), nil
},
}

Expand All @@ -306,7 +296,7 @@ var (
if err != nil {
return nil, err
}
return varNode(node, "sin", Numeric, math.Sin(num)), nil
return varNode(nil, "sin", Numeric, math.Sin(num)), nil
}
return nil, errorRequest("function 'sin' was called from non numeric node")
},
Expand All @@ -316,7 +306,7 @@ var (
if err != nil {
return nil, err
}
return varNode(node, "cos", Numeric, math.Cos(num)), nil
return varNode(nil, "cos", Numeric, math.Cos(num)), nil
}
return nil, errorRequest("function 'cos' was called from non numeric node")
},
Expand All @@ -326,6 +316,13 @@ var (
}
return nil, errorRequest("function 'length' was called from non array node")
},
"factorial": func(node *Node) (result *Node, err error) {
num, err := node.getUInteger()
if err != nil {
return
}
return varNode(nil, "factorial", Numeric, float64(mathFactorial(num))), nil
},
}
constants = map[string]*Node{
"pi": varNode(nil, "pi", Numeric, float64(math.Pi)),
Expand Down Expand Up @@ -494,12 +491,14 @@ func (b *buffer) token() (err error) {
c byte
stack = make([]byte, 0)
start int
find bool
)
tokenLoop:
for ; b.index < b.length; b.index++ {
c = b.data[b.index]
switch {
case c == quote:
find = true
start = b.index
err = b.step()
if err != nil {
Expand All @@ -511,31 +510,40 @@ tokenLoop:
}
b.index = start
case c == bracketL:
find = true
stack = append(stack, c)
case c == bracketR:
find = true
if len(stack) == 0 || stack[len(stack)-1] != bracketL {
return b.errorSymbol()
}
stack = stack[:len(stack)-1]
case c == parenthesesL:
find = true
stack = append(stack, c)
case c == parenthesesR:
find = true
if len(stack) == 0 || stack[len(stack)-1] != parenthesesL {
return b.errorSymbol()
}
stack = stack[:len(stack)-1]
case c == dot || c == at || c == dollar || c == question || c == asterisk || (c >= 'A' && c <= 'z') || (c >= '0' && c <= '9'): // standard token name
find = true
continue
case len(stack) != 0:
find = true
continue
case c == minus || c == plus:
start = b.index
err = b.numeric()
if err == nil || err == io.EOF {
b.index--
continue
if !find {
find = true
start = b.index
err = b.numeric()
if err == nil || err == io.EOF {
b.index--
continue
}
b.index = start
}
b.index = start
fallthrough
default:
break tokenLoop
Expand Down Expand Up @@ -642,12 +650,14 @@ func (b *buffer) rpn() (result rpn, err error) {
if err != io.EOF {
return nil, err
}
}
current = string(b.data[start:b.index])
result = append(result, current)
if err != nil {
err = nil
} else {
b.index--
}
current = string(b.data[start:b.index])
result = append(result, current)
case c == parenthesesL: // (
variable = false
current = string(c)
Expand Down Expand Up @@ -728,12 +738,12 @@ func (b *buffer) errorSymbol() error {
return errorSymbol(b)
}

//func mathFactorial(x uint) uint {
// if x == 0 {
// return 1
// }
// return x * mathFactorial(x-1)
//}
func mathFactorial(x uint) uint {
if x == 0 {
return 1
}
return x * mathFactorial(x-1)
}

func _floats(left, right *Node) (lnum, rnum float64, err error) {
lnum, err = left.GetNumeric()
Expand Down
2 changes: 2 additions & 0 deletions buffer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ func TestBuffer_Token(t *testing.T) {
{name: "part 1", value: "@[email protected]", index: 5, fail: false},
{name: "part 2", value: "@.foo && @.bar", index: 5, fail: false},
{name: "part 3", value: "@.foo,3", index: 5, fail: false},
{name: "part 4", value: "@.length-1", index: 8, fail: false},

{name: "number 1", value: "1", index: 1, fail: false},
{name: "number 2", value: "1.3e2", index: 5, fail: false},
Expand Down Expand Up @@ -61,6 +62,7 @@ func TestBuffer_RPN(t *testing.T) {
{name: "example_5", value: "pi != 'bar'", expected: []string{"pi", "'bar'", "!="}},
{name: "example_6", value: "3 + 4 * -2 / (-1 - 5)**-2", expected: []string{"3", "4", "-2", "*", "-1", "5", "-", "-2", "**", "/", "+"}},
{name: "example_7", value: "1.3e2 + sin(2*pi/3)", expected: []string{"1.3e2", "2", "pi", "*", "3", "/", "sin", "+"}},
{name: "example_8", value: "@.length-1", expected: []string{"@.length", "1", "-"}},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
Expand Down
Loading

0 comments on commit db2c579

Please sign in to comment.