code: func (p *parser) parseHelperName() ast.Node {
  	var result ast.Node
  
  	tok := p.next()
  
  	switch tok.Kind {
  	case lexer.TokenBoolean:
  		// BOOLEAN
  		p.shift()
  		result = ast.NewBooleanLiteral(tok.Pos, tok.Line, (tok.Val == "true"), tok.Val)
  	case lexer.TokenNumber:
  		// NUMBER
  		p.shift()
  
  		val, isInt := parseNumber(tok)
  		result = ast.NewNumberLiteral(tok.Pos, tok.Line, val, isInt, tok.Val)
  	case lexer.TokenString:
  		// STRING
  		p.shift()
  		result = ast.NewStringLiteral(tok.Pos, tok.Line, tok.Val)
  	case lexer.TokenData:
  		// dataName
  		result = p.parseDataName()
  	default:
  		// path
  		result = p.parsePath(false)
  	}
  
  	return result
  }
docs: // helperName : path | dataName | STRING | NUMBER | BOOLEAN | UNDEFINED | NULL