Parse::Yapp gdgd日記(1)
Foo.yp
%{ use strict; use warnings; use Data::Dumper; %} %% body : section | body section { shift; return join( "\n" , @_ ); } ; section : h1 { my ($self, @patterns) = @_; return '<h1>' . $patterns[0] . '</h1>'; } | letters RETURN ; h1 : ASTARISK letters RETURN { my ($self, @patterns) = @_; return $patterns[1]; } ; letters : LETTER | letters LETTER ; %% sub yyerror {} sub yylex { my ($self) = @_; $self->YYData->{INPUT} || return ('', undef); for ($self->YYData->{INPUT}) { printf("[debug] %s\n", $_); s/^\*// and return ('ASTARISK', $1 ); s/^\n// and return ( 'RETURN' , $1 ); s/^([^\n]+)// and return('LETTER' , $1 ) ; s/^(.)// and return($1,$1); } } sub run { my $self = shift; return $self->YYParse( yylex => \&yylex, yyerror => \&yyerror , yydebug => 0x1F ); }
foo.pl
#!/usr/bin/perl use strict; use warnings; use Foo; my $hoge = Foo->new(); $hoge->YYData->{INPUT} = "*明日は\n*雨だよ\nなんだって!\n"; my $result = $hoge->run; warn $result; 1;
result
<h1>明日は</h1> <h1>雨だよ</h1> なんだって!
次
- h2,h3対応 h1をセクション階層に切り上げ(blockにする)
- 太文字とか。
<div> <h1>明日は</h1> <h2>ほげ</h2> おうおうおう </div> <div> <h1>雨だよ</h1> なんだって!<b>それは困ったね!</b>傘がいるね! </div>
追記
h1ノタグつける処理してるとこ間違ってるな。h1のほうで本来はやるべき>