Closed hangingman closed 3 years ago
ref #32
class Skeleton
std::any
std::variant & std::visit
実装サンプル
// TParaTokenは基底となる型はstringで、内部的にenumで型を保持できる void Driver::visitPlusExp(PlusExp *plus_exp) { if (plus_exp->exp_1) { plus_exp->exp_1->accept(this); } TParaToken left = this->ctx.top(); left.MustBe(TParaToken::ttInteger); this->ctx.pop(); if (plus_exp->exp_2) { plus_exp->exp_2->accept(this); } TParaToken right = this->ctx.top(); right.MustBe(TParaToken::ttInteger); this->ctx.pop(); long sum = left.AsLong() + right.AsLong(); TParaToken t = TParaToken(std::to_string(sum), TParaToken::ttInteger); this->ctx.push(t); }
LGTM
ref #32
対応内容
Visitorパターンの実装
class Skeleton
を継承して、以下を参考にして大域変数をつかったpush/pop的な処理を作るstd::any
a57a1c0c208b574180c5ef4d15264d78614933b3std::variant & std::visit
5eb3b7c03d56e1aeec46243f6cc06a6f0c44db72実装サンプル
デバッグ