HobbyOSs / opennask

nask clone assembly, it can boot tiny OS with Linux
https://github.com/HobbyOSs/opennask/wiki/%E5%8B%95%E4%BD%9C%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF
GNU General Public License v3.0
21 stars 3 forks source link

opennaskの実装をbnfcの生成コードで置き換え(2) #41

Closed hangingman closed 3 years ago

hangingman commented 3 years ago

ref #32

対応内容

Visitorパターンの実装

実装サンプル

// 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);
}

デバッグ

hangingman commented 3 years ago

LGTM