Humanity

Edit the world by your favorite way

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')が

    1. camelizeされて'Handler'になって
    2. 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の他にもなんかいろいろ書きたいので
サンプルは↓に順次追加していきます