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]