...

Source file src/github.com/gobwas/glob/syntax/ast/ast.go

Documentation: github.com/gobwas/glob/syntax/ast

     1  package ast
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  )
     7  
     8  type Node struct {
     9  	Parent   *Node
    10  	Children []*Node
    11  	Value    interface{}
    12  	Kind     Kind
    13  }
    14  
    15  func NewNode(k Kind, v interface{}, ch ...*Node) *Node {
    16  	n := &Node{
    17  		Kind:  k,
    18  		Value: v,
    19  	}
    20  	for _, c := range ch {
    21  		Insert(n, c)
    22  	}
    23  	return n
    24  }
    25  
    26  func (a *Node) Equal(b *Node) bool {
    27  	if a.Kind != b.Kind {
    28  		return false
    29  	}
    30  	if a.Value != b.Value {
    31  		return false
    32  	}
    33  	if len(a.Children) != len(b.Children) {
    34  		return false
    35  	}
    36  	for i, c := range a.Children {
    37  		if !c.Equal(b.Children[i]) {
    38  			return false
    39  		}
    40  	}
    41  	return true
    42  }
    43  
    44  func (a *Node) String() string {
    45  	var buf bytes.Buffer
    46  	buf.WriteString(a.Kind.String())
    47  	if a.Value != nil {
    48  		buf.WriteString(" =")
    49  		buf.WriteString(fmt.Sprintf("%v", a.Value))
    50  	}
    51  	if len(a.Children) > 0 {
    52  		buf.WriteString(" [")
    53  		for i, c := range a.Children {
    54  			if i > 0 {
    55  				buf.WriteString(", ")
    56  			}
    57  			buf.WriteString(c.String())
    58  		}
    59  		buf.WriteString("]")
    60  	}
    61  	return buf.String()
    62  }
    63  
    64  func Insert(parent *Node, children ...*Node) {
    65  	parent.Children = append(parent.Children, children...)
    66  	for _, ch := range children {
    67  		ch.Parent = parent
    68  	}
    69  }
    70  
    71  type List struct {
    72  	Not   bool
    73  	Chars string
    74  }
    75  
    76  type Range struct {
    77  	Not    bool
    78  	Lo, Hi rune
    79  }
    80  
    81  type Text struct {
    82  	Text string
    83  }
    84  
    85  type Kind int
    86  
    87  const (
    88  	KindNothing Kind = iota
    89  	KindPattern
    90  	KindList
    91  	KindRange
    92  	KindText
    93  	KindAny
    94  	KindSuper
    95  	KindSingle
    96  	KindAnyOf
    97  )
    98  
    99  func (k Kind) String() string {
   100  	switch k {
   101  	case KindNothing:
   102  		return "Nothing"
   103  	case KindPattern:
   104  		return "Pattern"
   105  	case KindList:
   106  		return "List"
   107  	case KindRange:
   108  		return "Range"
   109  	case KindText:
   110  		return "Text"
   111  	case KindAny:
   112  		return "Any"
   113  	case KindSuper:
   114  		return "Super"
   115  	case KindSingle:
   116  		return "Single"
   117  	case KindAnyOf:
   118  		return "AnyOf"
   119  	default:
   120  		return ""
   121  	}
   122  }
   123  

View as plain text