func produceTokens(n parse.Node, tokenCh chan<- Token) { if len(n.Children()) == 0 { tokenType := ParserError moreStyle := "" switch n := n.(type) { case *parse.Primary: switch n.Type { case parse.Bareword: tokenType = Bareword case parse.SingleQuoted: tokenType = SingleQuoted case parse.DoubleQuoted: tokenType = DoubleQuoted case parse.Variable: tokenType = Variable case parse.Wildcard: tokenType = Wildcard case parse.Tilde: tokenType = Tilde } case *parse.Sep: tokenType = Sep moreStyle = styleForSep[n.SourceText()] } tokenCh <- Token{tokenType, n.SourceText(), n, moreStyle} } for _, child := range n.Children() { produceTokens(child, tokenCh) } }
func produceTokens(n parse.Node, tokenCh chan<- Token) { if n.Begin() == n.End() { // Ignore empty node. This happens e.g. with an empty source code, where // the parsed node is an empty Chunk. return } if len(n.Children()) == 0 { tokenType := ParserError moreStyle := "" switch n := n.(type) { case *parse.Primary: switch n.Type { case parse.Bareword: tokenType = Bareword case parse.SingleQuoted: tokenType = SingleQuoted case parse.DoubleQuoted: tokenType = DoubleQuoted case parse.Variable: tokenType = Variable case parse.Wildcard: tokenType = Wildcard case parse.Tilde: tokenType = Tilde } case *parse.Sep: tokenType = Sep septext := n.SourceText() if strings.HasPrefix(septext, "#") { moreStyle = styleForSep["#"] } else { moreStyle = styleForSep[septext] } default: Logger.Printf("bad leaf type %T", n) } tokenCh <- Token{tokenType, n.SourceText(), n, moreStyle} } for _, child := range n.Children() { produceTokens(child, tokenCh) } }