Last active
March 29, 2020 16:19
-
-
Save haruo-wakakusa/1b140b3dc5bd3a69ad150b4a00e8ae1b to your computer and use it in GitHub Desktop.
簡単な構文木を書こうとしたがprintするだけならTerm, Factorの概念必要なかったというコード(再帰継承しなくてよかった…)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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