本家「@IT」にはない内容をエンジニアライフで技術紹介するコラム。広く議論する場になることを目指します。

第061回_パラメータ実体テーブル作成処理の実装

»

一般実体テーブルの作成処理が完了したのでパラメータ実体テーブルの作成処理を実装します。

パラメータ実体宣言からパラメータ実体テーブルを作るクラス群


ParameterEntityDataパラメータ実体データの抽象クラス
InternalParameterEntityData内部・パラメータ実体を表すデータクラス
ExternalParameterEntityData外部・パラメータ実体を表すデータクラス
PeTableパラメータ実体テーブル(Mapをラッパーするクラス)
MakingPeTableVisitorパラメータ実体テーブルの作成

ParameterEntityDataの実装

ParameterEntityDataクラスはパラメータ実体を表す抽象クラスです。
実装は次のようにできます。
public abstract class ParameterEntityData
{
    private String m_name;
    
    public ParameterEntityData()
    {
        m_name=null;
    }
    
    public void setName(String name)
    {
        m_name = name;
    }
    
    public String getName()
    {
        return m_name;
    }
}

InternalParameterEntityDataの実装

InternalParameterEntityDataクラスは、内部・パラメータ実体を表すデータクラスです。
実装は次のようになります。
public class InternalParameterEntityData extends ParameterEntityData
{
    private String m_replacementText;
    
    public InternalParameterEntityData()
    {
        super();
        
        m_replacementText = null;
    }
    
    public void setText(String text)
    {
        m_replacementText =text;
    }
    
    public String toString()
    {
        return m_replacementText;
    }
}

ExternalParameterEntityDataの実装

ExternalParameterEntityDataクラスは、外部・パラメータ実体を表すデータクラスです。
実装は次のようになります。
public class ExternalParameterEntityData extends ParameterEntityData
{
    private ExternalID m_externalId;
    
    public ExternalParameterEntityData()
    {
        m_externalId = null;
    }
    
    public void setExternalId(ExternalID externalId)
    {
        m_externalId = externalId;
    }

    public ExternalID getExternalId()
    {
        return m_externalId;
    }

    public String toString()
    {
        return m_externalId.toString();
    }
}

PeTableの実装

PeTableクラスは、パラメータ実体テーブル(Mapをラッパーする)クラスです。
実装は次のようになります。
public class PeTable
{
    private final static PeTable m_instance = new PeTable();
    private Map<String,ParameterEntityData> m_map;
    
    private PeTable()
    {
        m_map = new HashMap<String,ParameterEntityData>();
    }
    
    public static PeTable getInstance()
    {
        return m_instance;
    }
    
    public void setData(ParameterEntityData data)
    {
        String name = data.getName();
        m_map.put(name, data);
    }
    
    public String getData(String name)
    {
        ParameterEntityData data = m_map.get(name);
        
        String ret = null;
        
        if (data == null)
        {
            //何もしない
        }
        else
        {
            ret = data.toString();
        }

        return ret;
    }
}

MakingPeTableVisitorの実装

MakingPeTableVisitorクラスは、パラメータ実体テーブルを作成するクラスです。
実装は次のようになります。
public class MakingParameterEntitySymbolTableVisitor
extends MakingEntitySymbolTableVisitor
{
    private static PeTable m_table = PeTable.getInstance();
    private ParameterEntityData m_data;
    private String              m_name;

    
    public MakingParameterEntitySymbolTableVisitor()
    {
        m_data = null;
        m_name = "";
    }
    
    @Override
    public void visit(EbnfPEDeclNode n)
    {
        super.visit(n);
        
        if(m_result)
        {
            //テーブルに追加する
            m_table.setData(m_data);
        }
        else
        {
            //何もしない
        }
    }
    
    
    public void visit(EbnfPeNameNode n)
    {
        Token token = m_tokenManager.nextToken();
        m_result = token.match(n);
        
        if(m_result)
        {
            //処理に成功したので巡回用データに登録する
            m_name = token.getString();
        }
        else
        {
            //何もしない
        }
    }
    
    @Override
    public void visit(EbnfPeEntityValueNode n)
    {
        EntityValueVisitor v = new EntityValueVisitor();
        
        v.visit(n);
        
        m_result = v.getResult();
        
        if (m_result)
        {
            InternalParameterEntityData data
               = new InternalParameterEntityData();
            
            data.setName(m_name);
            String value = v.getValue();
            data.setText(value);
            
            m_data = data;
        }
        else
        {
            //何もしない
        }
    }
    
    @Override
    public void visit(EbnfPeExternalIDNode n)
    {
        ExternalIDVisitor v
          = new ExternalIDVisitor();
        n.accept(v);
        
        m_result = v.getResult();
        
        if (m_result)
        {
            ExternalParameterEntityData data
               = new ExternalParameterEntityData();
            
            data.setName(m_name);
            ExternalID externalId = v.getExternalId();
            data.setExternalId(externalId);
            
            m_data = data;
        }
        else
        {
            //何もしない
        }
    }
}

ここまでのまとめ

今回まででW3Cの勧告のプロローグ、XML宣言、バージョン情報、エンコーディング宣言、スタンドアロン文書宣言、DOCTYPE宣言、内部サブセット、外部サブセット、マークアップ宣言、マークアップ宣言の区切り子、実体宣言を読み終わりました。
XMLの仕様から実践的にアプリケーションを開発する過程を十分に確認できたと思います。

残っている実装要素と結び

ざっくりに書くと、要素宣言の検討と実装(構文解析表の作成)、属性リスト宣言の検討と実装、記法宣言の検討と実装、外部サブセットの読み込み機能の検討、contentから抽象構文木を作成する機能の検討、属性値の正規化、抽象構文木と要素宣言データ/属性リスト宣言データの検証機能、サロゲートペアの対応が残っていますが、本コラムは書籍化を目標とした原稿ですから全部を公開するようなことにはなりません。
# 原稿も一部しか作ってません

それに正直、全61回でいまさらXMLの内容とか古臭いんだよ!って声が聞こえてきそうでした。なのでXMLライクなパーサの解説はここまでとしたいと思います。

次回からの内容と更新頻度

次回からは、「オリジナルのXMLライクなパーサが完成した」と仮定して第003回の終りに述べていたログ機構の検討をします。オリジナルのXMLライクなパーサを自作するとこんな事ができて便利だぞ!という紹介です。
尚、非常に心苦しいのですが、これまで毎週書いていたコラムを月1程度にします。
某2次小説サイトで自作小説を書いていて、それがこちらのコラムより圧倒的に人気があって......その、プログラミングをしている時間がとれなくなってしまったのが理由となります。手元に残り20回分の原稿があるのでそれで1年は持たせようと思います。すみません。その間に小説の執筆が終われば良いので、鋭意努力したいと思います。

ここまで読んでくれた方は少ないとは思いますが、感想などありましたらお気軽にどうぞ。

Comment(0)

コメント

コメントを投稿する