func (t *PrintNode) String() string {
	return fmt.Sprintf("Print(%s)", t.X)
}
String returns a string representation of a PrintNode.
package parse
import (
	"fmt"
	"sort"
	"strings"
)
type Node interface {
	String() string  
	Start() Pos      
	All() []Node     
}
type TrimmableNode struct {
	TrimBefore bool  
	TrimAfter  bool  
}
type Pos struct {
	Line   int
	Offset int
}
func (p Pos) Start() Pos {
	return p
}
func (p Pos) String() string {
	return fmt.Sprintf("%d:%d", p.Line, p.Offset)
}
type ModuleNode struct {
	*BodyNode
	Parent *ExtendsNode  
	Origin string        
}
func NewModuleNode(name string, nodes ...Node) *ModuleNode {
	return &ModuleNode{NewBodyNode(Pos{1, 0}, nodes...), nil, name}
}
func (l *ModuleNode) String() string {
	return fmt.Sprintf("Module%s", l.Nodes)
}
type BodyNode struct {
	Pos
	Nodes []Node
}
func NewBodyNode(pos Pos, nodes ...Node) *BodyNode {
	return &BodyNode{pos, nodes}
}
func (l *BodyNode) Append(n Node) {
	l.Nodes = append(l.Nodes, n)
}
func (l *BodyNode) String() string {
	return fmt.Sprintf("Body%s", l.Nodes)
}
func (l *BodyNode) All() []Node {
	return l.Nodes
}
type TextNode struct {
	Pos
	Data string  
}
func NewTextNode(data string, p Pos) *TextNode {
	return &TextNode{p, data}
}
func (t *TextNode) String() string {
	return fmt.Sprintf("Text(%s)", t.Data)
}
func (t *TextNode) All() []Node {
	return []Node{}
}
type CommentNode struct {
	*TextNode
	TrimmableNode
}
func NewCommentNode(data string, p Pos) *CommentNode {
	return &CommentNode{NewTextNode(data, p), TrimmableNode{}}
}
type PrintNode struct {
	Pos
	TrimmableNode
	X Expr  
}
func NewPrintNode(exp Expr, p Pos) *PrintNode {
	return &PrintNode{p, TrimmableNode{}, exp}
}