blob: 790217632042a0815bc53e066b2905e72c743759 [file] [log] [blame]
// Copyright 2017-2020 The Verible Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Symbol is a base class that covers both terminal and nonterminal symbols.
// See bison_parser_common.h for sample usage.
#ifndef VERIBLE_COMMON_TEXT_SYMBOL_H__
#define VERIBLE_COMMON_TEXT_SYMBOL_H__
#include <functional>
#include <iosfwd>
#include <memory>
#include "common/text/token_info.h"
#include "common/text/visitors.h"
namespace verible {
class Symbol;
using SymbolPtr = std::unique_ptr<Symbol>;
using TokenComparator =
std::function<bool(const TokenInfo &, const TokenInfo &)>;
// Kind is a datatype representing the subclass of a Symbol*
enum class SymbolKind { kLeaf, kNode };
std::ostream &operator<<(std::ostream &, SymbolKind);
// Pair that identifies a tree symbol (leaf or node).
struct SymbolTag {
SymbolKind kind;
int tag;
bool operator==(const SymbolTag &symbol_tag) const {
return kind == symbol_tag.kind && tag == symbol_tag.tag;
}
bool operator!=(const SymbolTag &symbol_tag) const {
return !(*this == symbol_tag);
}
};
// Pair of inline helper functions for building SymbolTag
template <typename EnumType>
constexpr SymbolTag NodeTag(EnumType tag) {
return {SymbolKind::kNode, static_cast<int>(tag)};
}
inline constexpr SymbolTag LeafTag(int tag) { return {SymbolKind::kLeaf, tag}; }
// forward declare Visitor classes to allow references in Symbol
class Symbol {
public:
virtual ~Symbol() {}
virtual bool equals(const Symbol *symbol,
const TokenComparator &compare_tokens) const = 0;
// Visitor pattern methods
virtual void Accept(TreeVisitorRecursive *visitor) const = 0;
virtual void Accept(SymbolVisitor *visitor) const = 0;
// The MutableTreeVisitorRecursive overload of Accept takes an extra
// SymbolPtr that is the owning pointer to this, so that it can be potentially
// deleted or replaced or transferred in a mutating pass.
virtual void Accept(MutableTreeVisitorRecursive *visitor,
SymbolPtr *this_owned) = 0;
// Implemented in subclasses to denote their type
virtual SymbolKind Kind() const = 0;
virtual SymbolTag Tag() const = 0;
protected:
Symbol() {}
};
} // namespace verible
#endif // VERIBLE_COMMON_TEXT_SYMBOL_H__