2011-12-11 7 views
1

私はHOP::Lexerを使って、BlitzMaxモジュールのソースコードをスキャンしてデータを取得しています。私が現在興味を持っているデータの1つの特定の部分は、モジュール記述です。HOP :: Lexer with overlapping tokens

現在、私はModuleInfo "Description: foobar"またはModuleInfo "Desc: foobar"という形式の説明を探しています。これは正常に動作します。しかし残念なことに、私がスキャンするほとんどのモジュールはコメントブロックの中で、他の場所で定義された記述を持っています。 BlitzMaxで実際にそれを行う一般的な方法は、ドキュメント生成プログラムが期待するとおりです。

これは、すべてのモジュールの説明がメインソースファイルで定義されている方法です。

Rem 
    bbdoc: my module description 
End Rem 
Module namespace.modulename 

これは実際問題ではありません。しかし、End Remの後の行には、必要なデータ(モジュール名)も含まれています。これは問題です。なぜなら、2つのトークンの定義がお互いに重なり、最初のトークンが検出された後、それは中断された位置(スキャンされるコンテンツの位置)から継続するからです。モジュール名のトークンが何も検出しないことを意味します。

はい、私はトークンの順序が正しいことを確認しました。カーソルを1行に戻すことは可能ではありません。

モジュール定義(働いたが、現在のテストケースのために働いていない)上にあるレムエンドレムブロック内の記述を取得するためのコードの小片:

 [ 'MODULEDESCRIPTION', 
      qr/[ \t]*\bRem\n(?:\n|.)*?\s*\bEnd[ \t]*Rem\nModule[\s\t]+/i, 
      sub { 
       my ($label, $value) = @_; 
       $value =~ /bbdoc: (.+)/; 
       [$label, $1]; 
       } 
     ], 

中のSO私のテストケース私は最初に1つのコメント、次にブロック(MODULEDESCRIPTION)、ブロックコメント(Rem-End Rem)、モジュール名などをスキャンします。

私が考えることのできる唯一の解決策は、モジュール記述のための2番目のレクサーですが、私はそれを好まないでしょう。 HOP :: Lexerを使って私が望むことは何でもできますか?私のレクサーの

ソースは、私はMODULEDESCRIPTIONを(を少し変更したバージョン)を追加することによってそれを解決してきましたhttps://github.com/maximos/maximus-web/blob/develop/lib/Maximus/Class/Lexer.pm

答えて

1

で見つけることができます。サブルーチンの中では、単にモジュール名をフィルターに掛けて4つの要素を持つ配列参照を返します。後で繰り返すことで、トークンとその値を持つ使いやすい配列を作成します。

ソリューションはhttps://github.com/maximos/maximus-web/blob/develop/lib/Maximus/Class/Lexer.pm

編集で再びです:または私はちょうどここ

 [ 'MODULEDESCRIPTION', 

      qr/[ \t]*\bRem\R(?:\R|.)*?\bEnd[ \t]*Rem\R\bModule[\s\t]\w+\.\w+/i, 
      sub { 
       my ($label, $value) = @_; 
       my ($desc) = ($value =~ /\bbbdoc: (.+)/i); 
       my ($name) = ($value =~ /\bModule (\w+\.\w+)/i); 
       [$label, $desc, 'MODULENAME', $name]; 
       } 
     ], 
のコードの一部を貼り付けてみましょう