ChangeLog parser with Parse/RecDescent

http://blogger.main.jp/changelog/2004-07-28-2.html
改造した。

いわゆる一つの再帰下降型構文解析
ループと分岐と関数呼び出しで書く例のやつです。
[src]
#! perl -w
# Parse ChangeLog
# Copyright: (C) Project PaoPei with zuihu 2004 JAPAN
# $Id: remoteclog.txt,v 1.2 2004/12/06 08:58:45 zuihu Exp $

# modified 2006-11-27, for chalow, cf. http://kerolin.jspeed.jp/2006/10/03/

package ParseChangeLog;
use strict;
use Parse::RecDescent;
use Data::Dumper;
$Parse::RecDescent::skip = '[\r\f\n]*';

my $grammar = q(
parse: entry(s)
{[{entry => $item[1]}]}

entry: entryheader item(s)
{{header => $item[1], item => $item[2] }}

entryheader: /^(\d{4}-\d{2}-\d{2})\s+(.+) \s+\<(.+)\>/
{@{$return}{qw(date user mail)} = ($1,$2,$3)}

item: itemheader itembody(s)
{
my $body = join ("\n", @{$item[2]});
@{$return}{qw(title tag body)} = ($item[1]->[0], $item[1]->[1], $body)
}

itemheader: /^\t\* ([^\[]*)(\[.*\]):/
{[$1,$2]}

itembody: /^(?!(\t\* .+?:|\d{4}-\d\d\-\d\d))(.*)/
{($2)}
);

my $text;
{
local $/ = undef;
$text = ;
}
my $log = Parse::RecDescent->new($grammar)->parse($text);
print Dumper($log);
[src]