Skip to content

Instantly share code, notes, and snippets.

@haruo-wakakusa
Last active March 29, 2020 16:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save haruo-wakakusa/1b140b3dc5bd3a69ad150b4a00e8ae1b to your computer and use it in GitHub Desktop.
Save haruo-wakakusa/1b140b3dc5bd3a69ad150b4a00e8ae1b to your computer and use it in GitHub Desktop.
簡単な構文木を書こうとしたがprintするだけならTerm, Factorの概念必要なかったというコード(再帰継承しなくてよかった…)
#include <iostream>
class Printable;
class Expression;
class Integer;
class Addition;
class Multiplication;
class Printable
{
protected:
virtual void print(std::ostream &out) const = 0;
public:
virtual ~Printable() { }
friend std::ostream &operator<<(std::ostream &out, const Printable &obj);
};
std::ostream &operator<<(std::ostream &out, const Printable &obj)
{
obj.print(out);
return out;
}
class Expression : virtual public Printable
{
};
class Integer : virtual public Expression
{
int data;
public:
Integer(int data) { this->data = data; }
int get() { return data; }
virtual void print (std::ostream &out) const { out << data; }
};
class Addition : virtual public Expression
{
Expression *left;
Expression *right;
public:
Addition(Expression *left, Expression *right) {
this->left = left;
this->right = right;
}
virtual void print(std::ostream &out) const {
out << *left << "+" << *right;
}
};
class Multiplication : virtual public Expression
{
Expression *left;
Expression *right;
public:
Multiplication(Expression *left, Expression *right) {
this->left = left;
this->right = right;
}
virtual void print(std::ostream &out) const {
if (typeid(*left) == typeid(Addition)) out << "(" << *left << ")";
else out << *left;
out << "*";
if (typeid(*right) == typeid(Addition)) out << "(" << *right << ")";
else out << *right;
}
};
int main() {
{
Integer i(1);
std::cout << i << std::endl;
}
{
Integer i(12), j(3);
Addition k(&i, &j);
std::cout << k << std::endl;
}
{
Integer i(4), j(56);
Multiplication k(&i, &j);
std::cout << k << std::endl;
}
{
Integer i(1), j(2), k(3), l(4), m(5), n(6);
Addition a(&i, &j);
Multiplication b(&a, &k);
Multiplication c(&b, &l);
Multiplication d(&m, &n);
Addition e(&c, &d);
std::cout << e << std::endl;
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment