Parse::Yapp gdgd日記(0)

Parse::Yapp入門した。正直さっぱりだ。

h1にする

こんなやつを

*hoge123あ

こうするだけ

<h1>hoge123あ</h1>

Hoge.pm

%{
use strict;
use warnings;
use Data::Dumper;
%}
%%
body : 
     | h1
    {
        my ($self, @patterns) = @_;
        return '<h1>' . $patterns[0] . '</h1>';
    }
     ;
h1   : '*' letters '\n'
        {
             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($1,$1);
        s/^(\n)// and  return($1,$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 );

}

hoge.pl

!/usr/bin/perl

use strict;
use warnings;
use Hoge;

my $hoge = Hoge->new();

$hoge->YYData->{INPUT} = "*hoge123あ\n";

my $result = $hoge->run;

warn $result;

1;

結果

<h1>hoge123あ</h1> at ./hoge.pl line 13.

うーん

次はこれかな。

*ほげほげ
*ほげほげ2
<h1>ほげほげ</h1>
<h1>ほげほげ2</h1>

:help! Don't panic!