#ifndef __ANTHEM__AST_FORWARD_H #define __ANTHEM__AST_FORWARD_H #include #include #include #include namespace anthem { //////////////////////////////////////////////////////////////////////////////////////////////////// // // AST Forward Declarations // //////////////////////////////////////////////////////////////////////////////////////////////////// namespace ast { //////////////////////////////////////////////////////////////////////////////////////////////////// struct And; struct BinaryOperation; struct Biconditional; struct Boolean; struct Comparison; struct Constant; struct Exists; struct ForAll; struct Function; struct Implies; struct In; struct Integer; struct Interval; struct Not; struct Or; struct Predicate; struct SpecialInteger; struct String; struct Variable; using AndPointer = std::unique_ptr; using BinaryOperationPointer = std::unique_ptr; using BiconditionalPointer = std::unique_ptr; using BooleanPointer = std::unique_ptr; using ComparisonPointer = std::unique_ptr; using ConstantPointer = std::unique_ptr; using ExistsPointer = std::unique_ptr; using ForAllPointer = std::unique_ptr; using FunctionPointer = std::unique_ptr; using ImpliesPointer = std::unique_ptr; using InPointer = std::unique_ptr; using IntegerPointer = std::unique_ptr; using IntervalPointer = std::unique_ptr; using NotPointer = std::unique_ptr; using OrPointer = std::unique_ptr; using PredicatePointer = std::unique_ptr; using SpecialIntegerPointer = std::unique_ptr; using StringPointer = std::unique_ptr; using VariablePointer = std::unique_ptr; //////////////////////////////////////////////////////////////////////////////////////////////////// // Variants //////////////////////////////////////////////////////////////////////////////////////////////////// using FormulaT = mapbox::util::variant< AndPointer, BiconditionalPointer, BooleanPointer, ComparisonPointer, ExistsPointer, ForAllPointer, ImpliesPointer, InPointer, NotPointer, OrPointer, PredicatePointer>; class Formula : public FormulaT { using FormulaT::FormulaT; }; using TermT = mapbox::util::variant< BinaryOperationPointer, BooleanPointer, ConstantPointer, FunctionPointer, IntegerPointer, IntervalPointer, SpecialIntegerPointer, StringPointer, VariablePointer>; class Term : public TermT { using TermT::TermT; }; //////////////////////////////////////////////////////////////////////////////////////////////////// } } #endif