[Cascavel-pm] Gramáticas, Parse::RecDescent (era: Casos de Sucesso)
Nelson Ferraz
nferraz em gmail.com
Quarta Agosto 8 07:05:58 PDT 2007
Obrigado pelas dicas!
Comecei com um parser bem simples, para um template como esse:
<body>
<& header.ma &>
<h1>teste</h1>
% my $name = "World";
<p>Hello, <% $name %>!</p>
</body>
Assim, cheguei a esta gramática:
my $grammar = q{
template : block(s)
block : mason
| html
{ print "$item{html}" }
mason : include # <& ... &>
| interpolation # <% ... %>
| inline_perl # % ...
| <error>
include : '<&' /\s*/ filename /\s*/
'&>' { print "[% PROCESS $item{filename} %]" }
interpolation : '<%' /\s*/ perl_var /\s*/ '%
>' { print "[% $item{perl_var} %]" }
inline_perl : '%' perl_code
{ print "[% $item{perl_code} %]" }
filename : /[\w\.]+/
perl_code : /.+/
perl_var : /[\$\@\%]\w+/
html : tag
| text
| mason
tag : /<[^<>]+>/
text : /[^<>]+/
};
Resultado:
<body>[% PROCESS header.ma %]<h1>teste</h1>[% my $name = "World"; %]
<p>Hello, [% $name %]!</p></body>
Não é exatamente o produto final, mas estou no caminho. :-)
Obrigado pelas dicas e sugestões. :-)
[]s
Nelson
Mais detalhes sobre a lista de discussão Cascavel-pm