/*
 * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License, version 2.0,
 * as published by the Free Software Foundation.
 *
 * This program is designed to work with certain software (including
 * but not limited to OpenSSL) that is licensed under separate terms, as
 * designated in a particular file or component or in included license
 * documentation.  The authors of MySQL hereby grant you an additional
 * permission to link the program and your derivative works with the
 * separately licensed software that they have either included with
 * the program or referenced in the documentation.
 * This program is distributed in the hope that it will be useful,  but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
 * the GNU General Public License, version 2.0, for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 
 */

#pragma once

#include <string>
#include <list>

class Grammar_tree_item
{
public:
//  enum Item_kind {ik_terminal, ik_nonterminal};
  typedef std::list<const Grammar_tree_item *> Item_list;

  Grammar_tree_item();
  Grammar_tree_item(const char *text/*, Item_kind item_kind*/);
  virtual ~Grammar_tree_item(void);
  std::string text() const;
  std::string text_unquoted() const;
  void text(const std::string &text);
  bool empty() const;
  bool is_terminal() const;
  bool is_prec_directive() const;
  bool is_last_non_prec_child(const Grammar_tree_item *item) const;
  bool non_prec_child_exists() const;
  bool has_more_then_one_meaningful_child() const;
  const Item_list * items() const;
  void add_item_as_last(const Grammar_tree_item *item);
  void add_item_as_first(const Grammar_tree_item *item);
  void flush(std::ostream& os) const;
//  inline Item_kind item_kind() const;

private:
  std::string _text;
  Item_list _items;
//  Item_kind _item_kind;
};
