Template::Parser

Template::Parserでは、'[%'('%]')をデフォルトデリミタ(※)としてtt2ファイルをparseします。

parseの方針は、

  1. ファイル先頭もしくは'%]'から、次の'[%'までのテキストを $preとして保存。(プレシーディング部)
  2. '[%'から'%]'の内部のテキストを $dirとして保存。(ディレクティブ部)

のようです。

こうして順次parseしていき、区切られたもの毎にごにょごにょするわけです。

ごにょごにょ

区切られたものには、$preと$dirがあります。
次は、$dirを tokenize_directiveメソッドを使って、ディレクティブトークンを作成します。

[
  ディレクティブ部,  ($dir) 
  テンプレート内でディレクティブが存在した行数の番号, ( 12-13 )
  tokenise_directive($dir), 
]

という配列リファレンスが@tokens(ディレクティブトークン)にpushされていきます。

sub tokenise_directive

[% html_str | html | html_line_break %]

$var1 = [
  'IDENT',
  'html_str',
  'FILTER',
  '|',
  'IDENT',
  'html',
  'FILTER',
  '|',
  'IDENT',
  'html_line_break'
];
[% test_msg1 = 'test1'
   test_msg2 = 'test2' %]

$var1 = [
  'IDENT',
  'test_msg1',
  'ASSIGN',
  '=',
  'LITERAL',
  '\'test1\'',
  'IDENT',
  'test_msg2',
  'ASSIGN',
  '=',
  'LITERAL',
  '\'test2\'',
];


(※)デリミタとして使えるものは、
Template::Parser - LALR(1) parser for compiling template documents - metacpan.org
のTAG_STYLEを参照。
また、TAGSディレクティブでいつでも指定可能です。

(※)ディレクティブのparseデリミタ(デフォルトは'|')に関しては、
http://search.cpan.org/src/ABW/Template-Toolkit-2.15/lib/Template/Parser.pm
sub tokenise_directive メソッドを参照。