お知らせ

ただいま、シンタックスハイライターの設定を見直しております。
プログラムが見にくくなっているページがありますが、ご容赦ください。

なんちゃってPascalを作ってみる(3)

プログラミング

こんにちは。前々回の自動投稿をセットしていたつもりでしたが、なぜか失敗していて実際の投稿は遅れてしまいました。

さて、前回はデザインパターンのうち、Compositeパターンを取り上げました。

今回は抽象構文木(Abstract Syntax Tree:AST)をCompositeパターンを使って概略を作っていこうと思います。

astEntryクラス

前回のEntryクラスを参考に、葉も節も扱えるastEntryクラスを作ってみます。

astがついているのは、構文抽象木のASTを作るつもりということで付けています。

まだ、全体像をつかめていないので、astEntry(仮)クラスとしておきます。

#pragma once
#include
using namespace std;

class astEntry
{
public:
    virtual string toFullString() = 0;

    string getType() {
		return _type;
	}
    
protected:
	string _type;
};

ほとんど前回のEntryクラスと同じということは気にしないでください。

astLeafクラス

次に葉にあたるクラスを作ります。

#pragma once
#include"token.h"
#include"astEntry.h"
#include
using namespace std;

class astLeaf :public astEntry
{
public:
	void set(token t) {
		_type = "L";
        _element = t;
    }

	string toFullString() override{
        return _element.toFullString();
	}

private:
	token _element;
};

前回のCompositeパターンでは、_elementはstringでしたが、今回はtokenとして定義しています。

違いはこの程度かな。

astNodeクラス

次に節にあたるクラスを作ります。

#pragma once
#include"astEntry.h"
#include
#include
using namespace std;


class astNode :public astEntry
{
public:
	void set(astEntry *e,string t) {
		_type = t;
		_element.push_back(e);
	}

    void set(astEntry *e){
		_element.push_back(e);
    }
	
	string toFullString() override{
		string res;
		for(auto e :_element)
		{
			res += e->toFullString();
			if (e != _element.back()) {
				res += ',';
			}
		}
        cout << '['+ res+']' << endl;
        return '[' + res + ']';
	}
private:
	list _element;
};

_elementがastEntryのリストになった程度の違いでしょうか。

週刊マンガでほとんどストーリーが進展しないで終わってしまう感じですが、今回はこれでおしまいにします。

それではまた。

Posted by kasugai