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のほうで本来はやるべき>