image

  • フォト Amazonギフト券
    ※この時計の時刻は、閲覧しているパソコンのものであり、必ずしも正確な時間とは限りません

検索

最近のトラックバック

無料ブログはココログ

« 2007年6月23日 | トップページ | 2007年6月26日 »

2007年6月24日

2007-06-24

racc で xvcd を生成することを試し始めた (その8)

ruby/racc で xfy/xvcd を生成する実験を続けています。

今回は、 #include 機能を追加しました。
   #include ファイルパス
と記すことで、C/C++ とおなじ ファイル内容取り込みを行えるようにしました。

必要な変更は parser 部のみ。

  def parse( f, fname )
    @q = []
    read(f, fname)
    @q.push [ false, '$' ]

    do_parse
  end

  def read( f, fname )
    @fname = fname
    lineno = 1

    f.each do |line|
      line.strip!
      until line.empty? do
        case line
        when /¥A#include¥s+([¥w¥.¥/]*).*/
          File.open( $1 ) do |incf|
            read(incf, $1)
          end
          @fname = fname

     ... 省略 ...

        else
          raise RuntimeError, 'must not happen'
        end
        line = $'
      end
      lineno += 1
    end
  end

#include のネストも可能です。
でも現状では include が無限ループしてしまう場合のチェックはしていません。

#include 機能をつかうことで、入力ソースはつぎのように記載することができます。
xfy/xvcd で共通な記述部を include でくくり出すことで、作成/保守がすこしは楽になるでしょう。

$ cat src
<<
// "Genereated using racc. 2007-06-24"
<<
#include inc/header.inc    # xvcd(...)
{
<<
#include inc/vocabulary.inc
<<
#include inc/command.inc
<<
#include inc/template.inc
};
#--- End of File ---

$ cat inc/header.inc
xvcd(
    xmlns             => "http://www.w3.org/1999/xhtml",
    xmlns:xvcd        => "http://xmlns.xfy.com/xvcd",
    xmlns:instruction => "http://xmlns.xfy.com/instruction",
    xmlns:ctrl        => "http://xmlns.xfy.com/controls",
    xmlns:event       => "http://xmlns.xfy.com/event",
    xmlns:ui          => "http://xmlns.xfy.com/ui",
    xmlns:command     => "http://xmlns.xfy.com/command",
    xmlns:ab          => "http://xmlns.example.com/developer/tutorial/addressbook",
    version           => "1.0"
)

$ cat inc/vocabulary.inc
  //============== VOCABULARY ==========
  vocabulary(name          => "AddressBook",
             match         => "ab:addressbook",
             call-template => "Root") {
    //============== MENU ==========
    ui:ui(version=>"1.0") {
      ui:main-menu() {
        ui:menu(label=>"Entry") {
          ui:menu-item(label=>"add", command=>"my:AddEntry",  open-dialog=>"true");
          ui:menu-item(label=>"edit", command=>"my:EditEntry", open-dialog=>"true");
        };
      };
    };
  };

$ cat inc/template.inc
  //============== TEMPLATE ==========
  template(name=>"EditDialogRoot") {
    html() {
      body()
    };
  };

include 機能は単に、ファイルを分割するだけであり、オブジェクト指向という観点からは有用な機能ではありません。
次は、
xvcd の一部分を override する, 機能を追加する(java での class の extends に相当) することを実装しましょう。
xfy/xvcd にオブジェクト指向的な要素を追加した記述を可能にすることで、プラグインを作成しやすくなると考えています。

« 2007年6月23日 | トップページ | 2007年6月26日 »

mokuji

2013年12月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        

google

  • twitter
  • __
  • _
    Googleボットチェッカー

合わせて読む

  • 合わせて読む
    フィードメーター - katoy: cocolog あわせて読みたい

リンク