mirror of
https://github.com/miguelmota/cointop
synced 2024-11-10 13:10:26 +00:00
172 lines
2.0 KiB
Go
172 lines
2.0 KiB
Go
|
package ast
|
||
|
|
||
|
import (
|
||
|
"reflect"
|
||
|
"regexp"
|
||
|
|
||
|
"github.com/antonmedv/expr/file"
|
||
|
)
|
||
|
|
||
|
// Node represents items of abstract syntax tree.
|
||
|
type Node interface {
|
||
|
Location() file.Location
|
||
|
SetLocation(file.Location)
|
||
|
Type() reflect.Type
|
||
|
SetType(reflect.Type)
|
||
|
}
|
||
|
|
||
|
func Patch(node *Node, newNode Node) {
|
||
|
newNode.SetType((*node).Type())
|
||
|
newNode.SetLocation((*node).Location())
|
||
|
*node = newNode
|
||
|
}
|
||
|
|
||
|
type base struct {
|
||
|
loc file.Location
|
||
|
nodeType reflect.Type
|
||
|
}
|
||
|
|
||
|
func (n *base) Location() file.Location {
|
||
|
return n.loc
|
||
|
}
|
||
|
|
||
|
func (n *base) SetLocation(loc file.Location) {
|
||
|
n.loc = loc
|
||
|
}
|
||
|
|
||
|
func (n *base) Type() reflect.Type {
|
||
|
return n.nodeType
|
||
|
}
|
||
|
|
||
|
func (n *base) SetType(t reflect.Type) {
|
||
|
n.nodeType = t
|
||
|
}
|
||
|
|
||
|
type NilNode struct {
|
||
|
base
|
||
|
}
|
||
|
|
||
|
type IdentifierNode struct {
|
||
|
base
|
||
|
Value string
|
||
|
NilSafe bool
|
||
|
}
|
||
|
|
||
|
type IntegerNode struct {
|
||
|
base
|
||
|
Value int
|
||
|
}
|
||
|
|
||
|
type FloatNode struct {
|
||
|
base
|
||
|
Value float64
|
||
|
}
|
||
|
|
||
|
type BoolNode struct {
|
||
|
base
|
||
|
Value bool
|
||
|
}
|
||
|
|
||
|
type StringNode struct {
|
||
|
base
|
||
|
Value string
|
||
|
}
|
||
|
|
||
|
type ConstantNode struct {
|
||
|
base
|
||
|
Value interface{}
|
||
|
}
|
||
|
|
||
|
type UnaryNode struct {
|
||
|
base
|
||
|
Operator string
|
||
|
Node Node
|
||
|
}
|
||
|
|
||
|
type BinaryNode struct {
|
||
|
base
|
||
|
Operator string
|
||
|
Left Node
|
||
|
Right Node
|
||
|
}
|
||
|
|
||
|
type MatchesNode struct {
|
||
|
base
|
||
|
Regexp *regexp.Regexp
|
||
|
Left Node
|
||
|
Right Node
|
||
|
}
|
||
|
|
||
|
type PropertyNode struct {
|
||
|
base
|
||
|
Node Node
|
||
|
Property string
|
||
|
NilSafe bool
|
||
|
}
|
||
|
|
||
|
type IndexNode struct {
|
||
|
base
|
||
|
Node Node
|
||
|
Index Node
|
||
|
}
|
||
|
|
||
|
type SliceNode struct {
|
||
|
base
|
||
|
Node Node
|
||
|
From Node
|
||
|
To Node
|
||
|
}
|
||
|
|
||
|
type MethodNode struct {
|
||
|
base
|
||
|
Node Node
|
||
|
Method string
|
||
|
Arguments []Node
|
||
|
NilSafe bool
|
||
|
}
|
||
|
|
||
|
type FunctionNode struct {
|
||
|
base
|
||
|
Name string
|
||
|
Arguments []Node
|
||
|
Fast bool
|
||
|
}
|
||
|
|
||
|
type BuiltinNode struct {
|
||
|
base
|
||
|
Name string
|
||
|
Arguments []Node
|
||
|
}
|
||
|
|
||
|
type ClosureNode struct {
|
||
|
base
|
||
|
Node Node
|
||
|
}
|
||
|
|
||
|
type PointerNode struct {
|
||
|
base
|
||
|
}
|
||
|
|
||
|
type ConditionalNode struct {
|
||
|
base
|
||
|
Cond Node
|
||
|
Exp1 Node
|
||
|
Exp2 Node
|
||
|
}
|
||
|
|
||
|
type ArrayNode struct {
|
||
|
base
|
||
|
Nodes []Node
|
||
|
}
|
||
|
|
||
|
type MapNode struct {
|
||
|
base
|
||
|
Pairs []Node
|
||
|
}
|
||
|
|
||
|
type PairNode struct {
|
||
|
base
|
||
|
Key Node
|
||
|
Value Node
|
||
|
}
|