Perlでパースを多分楽にするText::Tokenizer::Classっていうモジュール作ってみた
作ってみた → Githubに置いてあります。
っていってもこれは最初MySchemeとか適当に名付けたモジュールを作っている途中に
「このパーサ部分他のモジュールとしても使えそうじゃね?」と思ったので思い切って(?)モジュール化したものなので
Text::Tokenizer::Classをgit cloneしてインストール・・・とかしたら何か不都合が起きたとき怖いのでPERL5LIBって環境変数に
モジュールが置いてあるパスを指定して使うことをお勧めします。。。(ちゃんとしたモジュール作るのはこれが初めてなので。。。
ちょっとしたサンプルとか
use strict; use warnings; use Perl6::Say; use Text::Tokenizer::Class; my $parser = Text::Tokenizer::Class->new(parse_type => 'handler'); $parser->string("hello, world."); $parser->ignore_chars(qr/\W/); $parser->add_pattern(qr/\w/ => sub { say shift->step() }); $parser->parse(); # => "hello\nworld\n"
まずnewでのparse_typeは必ず指定します。
そのparse_typeの次に指定されたもの(この場合は'handler')が
-
- camelizeされて'Handler'になって
- Text::Tokenizer::Class::Token::Handler がrequireされる
ことになります。
あとText::Tokenizer::Classは基本的な機能しか持ってません。
基本的に文字列(IO::Stringとして扱われています)を1文字ずつgetcしていきます。
だいたいこんな感じです
until ($str->eof) { my $c = $str->getc; return undef unless defined $c; $self->_notify($c); }
$self->_notify($c) はrequireされたモジュールに渡されます。
で、そのモジュールがadd_patternていうパターンを決めるメソッドを定義してたり色々してます。
MySchemeの他にもなんかいろいろ書きたいので
サンプルは↓に順次追加していきます