feature: parser
This commit is contained in:
@@ -1 +1,52 @@
|
||||
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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user