@IT」にはない内容をエンジニアライフで技術紹介するコラム。広く議論する場になることを目指します。2018/03/05前回の続きで、検討したVisitorを実装します。工夫の内容を元にNameノードから値を取得するGettingNameVisitorを実装します。実装は次のようにできます。EntityValueVisitorの実装は次のようになります。}}EntityReferenceHelperの実装EntityValueVisitorに出てきたEntityReferenceHelperは一般実体の参照の処理の違いを表現するクラスです。EntityValueで一般実体参照を認識したときの処理2.一般実体の参照を認識したとき(修正なし)2-1.参照名を参照チェックテーブルに登録する2-2.バイパスする(何もしない)を実装すると、次のようになります。}}EntityReferenceCheckSetの実装EntityReferenceCheckSetは検討の中に出てきた一般実体の参照をチェックするテーブル(セット)です。登録部分のみを実装すると、次のようになります。}}PeReferenceHelperの実装EntityValueVisitorで使っているPeReferenceHelperについて説明します。PeReferenceHelperはパラメータ実体参照の、出現位置による処理の違いを表現するクラスです。EntityValueでパラメータ実体参照を認識したときの処理3.パラメータ実体の参照を認識したとき(修正あり)3-1.実体名をキーにパラメータ実体テーブルを検索する3-2.実体名がテーブルに無い場合3-2-1.スタンドアロン文書宣言がyesのとき3-2-1-1.★仕様なし3-2-2.スタンドアロン文書宣言がnoのとき3-2-2-1.外部サブセットが無い場合3-2-2-1-1.★仕様なし3-2-2-2.外部サブセットが有る場合3-2-2-2-1.妥当性制約違反エラー3-3.実体名がテーブルに有る場合3-3-1.再帰用のスタックに実体名を追加する3-3-2.置換テキストRepTextを取得する3-3-3.RepTextをReplacementTextで構文解析する3-3-4.パラメータ実体のトークン列の代わりに構文解析したトークン列を返すを実装すると、次のようになります。}}ここで、ReplacementTextの構文解析の前後に、第021回で説明したコンテキストの切り替えを実施しています。DoctypedeclVisitor/DoctypeDataの修正PeReferenceHelperで出てきた外部サブセットの有無情報の取得処理を第046回で実装したDoctypedeclVisitor/DoctypeDataに追加します。}}ExternalIDの実装は、EntityValue内のExternalIDで工夫した部分です。Doctypedecl内でも処理用のEbnfDocExternalIDNodeを追加しています。長くなりましたのでExternalIDの説明は次回にします。通信系と自動車関連のシステム開発の下請けを経て、現在は家業を継いでIT系の仕事から離れています。本コラムは趣味で研究している内容がメインです。書籍「プログラミング思考のレッスン」を読んでみた。利用規約ITmediaはアイティメディア株式会社の登録商標です。