123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601 |
- package parser
- import (
- "strings"
- "github.com/d5/tengo/v2/token"
- )
- // Expr represents an expression node in the AST.
- type Expr interface {
- Node
- exprNode()
- }
- // ArrayLit represents an array literal.
- type ArrayLit struct {
- Elements []Expr
- LBrack Pos
- RBrack Pos
- }
- func (e *ArrayLit) exprNode() {}
- // Pos returns the position of first character belonging to the node.
- func (e *ArrayLit) Pos() Pos {
- return e.LBrack
- }
- // End returns the position of first character immediately after the node.
- func (e *ArrayLit) End() Pos {
- return e.RBrack + 1
- }
- func (e *ArrayLit) String() string {
- var elements []string
- for _, m := range e.Elements {
- elements = append(elements, m.String())
- }
- return "[" + strings.Join(elements, ", ") + "]"
- }
- // BadExpr represents a bad expression.
- type BadExpr struct {
- From Pos
- To Pos
- }
- func (e *BadExpr) exprNode() {}
- // Pos returns the position of first character belonging to the node.
- func (e *BadExpr) Pos() Pos {
- return e.From
- }
- // End returns the position of first character immediately after the node.
- func (e *BadExpr) End() Pos {
- return e.To
- }
- func (e *BadExpr) String() string {
- return "<bad expression>"
- }
- // BinaryExpr represents a binary operator expression.
- type BinaryExpr struct {
- LHS Expr
- RHS Expr
- Token token.Token
- TokenPos Pos
- }
- func (e *BinaryExpr) exprNode() {}
- // Pos returns the position of first character belonging to the node.
- func (e *BinaryExpr) Pos() Pos {
- return e.LHS.Pos()
- }
- // End returns the position of first character immediately after the node.
- func (e *BinaryExpr) End() Pos {
- return e.RHS.End()
- }
- func (e *BinaryExpr) String() string {
- return "(" + e.LHS.String() + " " + e.Token.String() +
- " " + e.RHS.String() + ")"
- }
- // BoolLit represents a boolean literal.
- type BoolLit struct {
- Value bool
- ValuePos Pos
- Literal string
- }
- func (e *BoolLit) exprNode() {}
- // Pos returns the position of first character belonging to the node.
- func (e *BoolLit) Pos() Pos {
- return e.ValuePos
- }
- // End returns the position of first character immediately after the node.
- func (e *BoolLit) End() Pos {
- return Pos(int(e.ValuePos) + len(e.Literal))
- }
- func (e *BoolLit) String() string {
- return e.Literal
- }
- // CallExpr represents a function call expression.
- type CallExpr struct {
- Func Expr
- LParen Pos
- Args []Expr
- Ellipsis Pos
- RParen Pos
- }
- func (e *CallExpr) exprNode() {}
- // Pos returns the position of first character belonging to the node.
- func (e *CallExpr) Pos() Pos {
- return e.Func.Pos()
- }
- // End returns the position of first character immediately after the node.
- func (e *CallExpr) End() Pos {
- return e.RParen + 1
- }
- func (e *CallExpr) String() string {
- var args []string
- for _, e := range e.Args {
- args = append(args, e.String())
- }
- if len(args) > 0 && e.Ellipsis.IsValid() {
- args[len(args)-1] = args[len(args)-1] + "..."
- }
- return e.Func.String() + "(" + strings.Join(args, ", ") + ")"
- }
- // CharLit represents a character literal.
- type CharLit struct {
- Value rune
- ValuePos Pos
- Literal string
- }
- func (e *CharLit) exprNode() {}
- // Pos returns the position of first character belonging to the node.
- func (e *CharLit) Pos() Pos {
- return e.ValuePos
- }
- // End returns the position of first character immediately after the node.
- func (e *CharLit) End() Pos {
- return Pos(int(e.ValuePos) + len(e.Literal))
- }
- func (e *CharLit) String() string {
- return e.Literal
- }
- // CondExpr represents a ternary conditional expression.
- type CondExpr struct {
- Cond Expr
- True Expr
- False Expr
- QuestionPos Pos
- ColonPos Pos
- }
- func (e *CondExpr) exprNode() {}
- // Pos returns the position of first character belonging to the node.
- func (e *CondExpr) Pos() Pos {
- return e.Cond.Pos()
- }
- // End returns the position of first character immediately after the node.
- func (e *CondExpr) End() Pos {
- return e.False.End()
- }
- func (e *CondExpr) String() string {
- return "(" + e.Cond.String() + " ? " + e.True.String() +
- " : " + e.False.String() + ")"
- }
- // ErrorExpr represents an error expression
- type ErrorExpr struct {
- Expr Expr
- ErrorPos Pos
- LParen Pos
- RParen Pos
- }
- func (e *ErrorExpr) exprNode() {}
- // Pos returns the position of first character belonging to the node.
- func (e *ErrorExpr) Pos() Pos {
- return e.ErrorPos
- }
- // End returns the position of first character immediately after the node.
- func (e *ErrorExpr) End() Pos {
- return e.RParen
- }
- func (e *ErrorExpr) String() string {
- return "error(" + e.Expr.String() + ")"
- }
- // FloatLit represents a floating point literal.
- type FloatLit struct {
- Value float64
- ValuePos Pos
- Literal string
- }
- func (e *FloatLit) exprNode() {}
- // Pos returns the position of first character belonging to the node.
- func (e *FloatLit) Pos() Pos {
- return e.ValuePos
- }
- // End returns the position of first character immediately after the node.
- func (e *FloatLit) End() Pos {
- return Pos(int(e.ValuePos) + len(e.Literal))
- }
- func (e *FloatLit) String() string {
- return e.Literal
- }
- // FuncLit represents a function literal.
- type FuncLit struct {
- Type *FuncType
- Body *BlockStmt
- }
- func (e *FuncLit) exprNode() {}
- // Pos returns the position of first character belonging to the node.
- func (e *FuncLit) Pos() Pos {
- return e.Type.Pos()
- }
- // End returns the position of first character immediately after the node.
- func (e *FuncLit) End() Pos {
- return e.Body.End()
- }
- func (e *FuncLit) String() string {
- return "func" + e.Type.Params.String() + " " + e.Body.String()
- }
- // FuncType represents a function type definition.
- type FuncType struct {
- FuncPos Pos
- Params *IdentList
- }
- func (e *FuncType) exprNode() {}
- // Pos returns the position of first character belonging to the node.
- func (e *FuncType) Pos() Pos {
- return e.FuncPos
- }
- // End returns the position of first character immediately after the node.
- func (e *FuncType) End() Pos {
- return e.Params.End()
- }
- func (e *FuncType) String() string {
- return "func" + e.Params.String()
- }
- // Ident represents an identifier.
- type Ident struct {
- Name string
- NamePos Pos
- }
- func (e *Ident) exprNode() {}
- // Pos returns the position of first character belonging to the node.
- func (e *Ident) Pos() Pos {
- return e.NamePos
- }
- // End returns the position of first character immediately after the node.
- func (e *Ident) End() Pos {
- return Pos(int(e.NamePos) + len(e.Name))
- }
- func (e *Ident) String() string {
- if e != nil {
- return e.Name
- }
- return nullRep
- }
- // ImmutableExpr represents an immutable expression
- type ImmutableExpr struct {
- Expr Expr
- ErrorPos Pos
- LParen Pos
- RParen Pos
- }
- func (e *ImmutableExpr) exprNode() {}
- // Pos returns the position of first character belonging to the node.
- func (e *ImmutableExpr) Pos() Pos {
- return e.ErrorPos
- }
- // End returns the position of first character immediately after the node.
- func (e *ImmutableExpr) End() Pos {
- return e.RParen
- }
- func (e *ImmutableExpr) String() string {
- return "immutable(" + e.Expr.String() + ")"
- }
- // ImportExpr represents an import expression
- type ImportExpr struct {
- ModuleName string
- Token token.Token
- TokenPos Pos
- }
- func (e *ImportExpr) exprNode() {}
- // Pos returns the position of first character belonging to the node.
- func (e *ImportExpr) Pos() Pos {
- return e.TokenPos
- }
- // End returns the position of first character immediately after the node.
- func (e *ImportExpr) End() Pos {
- // import("moduleName")
- return Pos(int(e.TokenPos) + 10 + len(e.ModuleName))
- }
- func (e *ImportExpr) String() string {
- return `import("` + e.ModuleName + `")`
- }
- // IndexExpr represents an index expression.
- type IndexExpr struct {
- Expr Expr
- LBrack Pos
- Index Expr
- RBrack Pos
- }
- func (e *IndexExpr) exprNode() {}
- // Pos returns the position of first character belonging to the node.
- func (e *IndexExpr) Pos() Pos {
- return e.Expr.Pos()
- }
- // End returns the position of first character immediately after the node.
- func (e *IndexExpr) End() Pos {
- return e.RBrack + 1
- }
- func (e *IndexExpr) String() string {
- var index string
- if e.Index != nil {
- index = e.Index.String()
- }
- return e.Expr.String() + "[" + index + "]"
- }
- // IntLit represents an integer literal.
- type IntLit struct {
- Value int64
- ValuePos Pos
- Literal string
- }
- func (e *IntLit) exprNode() {}
- // Pos returns the position of first character belonging to the node.
- func (e *IntLit) Pos() Pos {
- return e.ValuePos
- }
- // End returns the position of first character immediately after the node.
- func (e *IntLit) End() Pos {
- return Pos(int(e.ValuePos) + len(e.Literal))
- }
- func (e *IntLit) String() string {
- return e.Literal
- }
- // MapElementLit represents a map element.
- type MapElementLit struct {
- Key string
- KeyPos Pos
- ColonPos Pos
- Value Expr
- }
- func (e *MapElementLit) exprNode() {}
- // Pos returns the position of first character belonging to the node.
- func (e *MapElementLit) Pos() Pos {
- return e.KeyPos
- }
- // End returns the position of first character immediately after the node.
- func (e *MapElementLit) End() Pos {
- return e.Value.End()
- }
- func (e *MapElementLit) String() string {
- return e.Key + ": " + e.Value.String()
- }
- // MapLit represents a map literal.
- type MapLit struct {
- LBrace Pos
- Elements []*MapElementLit
- RBrace Pos
- }
- func (e *MapLit) exprNode() {}
- // Pos returns the position of first character belonging to the node.
- func (e *MapLit) Pos() Pos {
- return e.LBrace
- }
- // End returns the position of first character immediately after the node.
- func (e *MapLit) End() Pos {
- return e.RBrace + 1
- }
- func (e *MapLit) String() string {
- var elements []string
- for _, m := range e.Elements {
- elements = append(elements, m.String())
- }
- return "{" + strings.Join(elements, ", ") + "}"
- }
- // ParenExpr represents a parenthesis wrapped expression.
- type ParenExpr struct {
- Expr Expr
- LParen Pos
- RParen Pos
- }
- func (e *ParenExpr) exprNode() {}
- // Pos returns the position of first character belonging to the node.
- func (e *ParenExpr) Pos() Pos {
- return e.LParen
- }
- // End returns the position of first character immediately after the node.
- func (e *ParenExpr) End() Pos {
- return e.RParen + 1
- }
- func (e *ParenExpr) String() string {
- return "(" + e.Expr.String() + ")"
- }
- // SelectorExpr represents a selector expression.
- type SelectorExpr struct {
- Expr Expr
- Sel Expr
- }
- func (e *SelectorExpr) exprNode() {}
- // Pos returns the position of first character belonging to the node.
- func (e *SelectorExpr) Pos() Pos {
- return e.Expr.Pos()
- }
- // End returns the position of first character immediately after the node.
- func (e *SelectorExpr) End() Pos {
- return e.Sel.End()
- }
- func (e *SelectorExpr) String() string {
- return e.Expr.String() + "." + e.Sel.String()
- }
- // SliceExpr represents a slice expression.
- type SliceExpr struct {
- Expr Expr
- LBrack Pos
- Low Expr
- High Expr
- RBrack Pos
- }
- func (e *SliceExpr) exprNode() {}
- // Pos returns the position of first character belonging to the node.
- func (e *SliceExpr) Pos() Pos {
- return e.Expr.Pos()
- }
- // End returns the position of first character immediately after the node.
- func (e *SliceExpr) End() Pos {
- return e.RBrack + 1
- }
- func (e *SliceExpr) String() string {
- var low, high string
- if e.Low != nil {
- low = e.Low.String()
- }
- if e.High != nil {
- high = e.High.String()
- }
- return e.Expr.String() + "[" + low + ":" + high + "]"
- }
- // StringLit represents a string literal.
- type StringLit struct {
- Value string
- ValuePos Pos
- Literal string
- }
- func (e *StringLit) exprNode() {}
- // Pos returns the position of first character belonging to the node.
- func (e *StringLit) Pos() Pos {
- return e.ValuePos
- }
- // End returns the position of first character immediately after the node.
- func (e *StringLit) End() Pos {
- return Pos(int(e.ValuePos) + len(e.Literal))
- }
- func (e *StringLit) String() string {
- return e.Literal
- }
- // UnaryExpr represents an unary operator expression.
- type UnaryExpr struct {
- Expr Expr
- Token token.Token
- TokenPos Pos
- }
- func (e *UnaryExpr) exprNode() {}
- // Pos returns the position of first character belonging to the node.
- func (e *UnaryExpr) Pos() Pos {
- return e.Expr.Pos()
- }
- // End returns the position of first character immediately after the node.
- func (e *UnaryExpr) End() Pos {
- return e.Expr.End()
- }
- func (e *UnaryExpr) String() string {
- return "(" + e.Token.String() + e.Expr.String() + ")"
- }
- // UndefinedLit represents an undefined literal.
- type UndefinedLit struct {
- TokenPos Pos
- }
- func (e *UndefinedLit) exprNode() {}
- // Pos returns the position of first character belonging to the node.
- func (e *UndefinedLit) Pos() Pos {
- return e.TokenPos
- }
- // End returns the position of first character immediately after the node.
- func (e *UndefinedLit) End() Pos {
- return e.TokenPos + 9 // len(undefined) == 9
- }
- func (e *UndefinedLit) String() string {
- return "undefined"
- }
|