[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