53 lines
884 B
Go
53 lines
884 B
Go
package parser
|
|
|
|
import "sfdl/scanner"
|
|
|
|
type ExprNode struct {
|
|
Op scanner.TokenType
|
|
Left *ExprNode
|
|
Right *ExprNode
|
|
Value float64
|
|
Func func(float64) float64
|
|
}
|
|
|
|
func NewConstNode(v float64) *ExprNode {
|
|
return &ExprNode{
|
|
Op: scanner.CONST_ID,
|
|
Value: v,
|
|
}
|
|
}
|
|
|
|
func NewTNode() *ExprNode {
|
|
return &ExprNode{
|
|
Op: scanner.T,
|
|
}
|
|
}
|
|
|
|
func NewFuncNode(fn func(float64) float64, child *ExprNode) *ExprNode {
|
|
return &ExprNode{
|
|
Op: scanner.FUNC,
|
|
Left: child,
|
|
Func: fn,
|
|
}
|
|
}
|
|
|
|
func NewBinaryNode(op scanner.TokenType, left, right *ExprNode) *ExprNode {
|
|
return &ExprNode{
|
|
Op: op,
|
|
Left: left,
|
|
Right: right,
|
|
}
|
|
}
|
|
|
|
func NewUnaryNode(op scanner.TokenType, child *ExprNode) *ExprNode {
|
|
if op == scanner.PLUS {
|
|
return child
|
|
}
|
|
// -x -> 0 - x
|
|
if op == scanner.MINUS {
|
|
zero := NewConstNode(0)
|
|
return NewBinaryNode(scanner.MINUS, zero, child)
|
|
}
|
|
return child
|
|
}
|