code: func (t *tree) parsePrint(token item) ast.Node {
  	var expr = t.parseExpr(0)
  	var directives []*ast.PrintDirectiveNode
  	for {
  		switch tok := t.next(); tok.typ {
  		case itemRightDelim:
  			return &ast.PrintNode{token.pos, expr, directives}
  		case itemPipe:
  			// read the directive name and see if there are arguments
  			var id = t.expect(itemIdent, "print directive")
  			var args []ast.Node
  			for {
  				// each argument is preceeded by a colon (first arg) or comma (subsequent)
  				switch next := t.next(); next.typ {
  				case itemColon, itemComma:
  					args = append(args, t.parseExpr(0))
  					continue
  				}
  				t.backup()
  				directives = append(directives, &ast.PrintDirectiveNode{tok.pos, id.val, args})
  				break
  			}
  		default:
  			t.unexpected(tok, "print. (expected '|' or '}')")
  		}
  	}
  }
docs: // print has just been read (or inferred)