[SP-pm] Substituicoes balanceadas

Luis Motta Campos monsieur_champs em yahoo.com.br
Segunda Abril 17 13:33:34 PDT 2006


Roberto Maluhy Junior wrote:
> Ola Novamente,
> 
> Estou com alguma, para não dizer muita, dificuldade com uma
> substituição balanceada e caso vocês possam me ajudar, ficarei muito
> grato.
> 
> O problema é o seguinte:
> Suponha $a = "abc abc \$abc\$ abc \$abc\$\$abc\$ \$abc\{\$abc
> \{abc\}\$ abc\}\$ abc";
> 
> Gostaria de detectar, ou melhor, substituir "inicios" e "finais" de
> $'s por <BEGIN> e <END>, respectivamente, mas com uma condição de
> hierarquia baseada na presença de chaves, assim, $a ficaria:
> abc abc <BEGIN>abc<END> abc <BEGIN>abc<END><BEGIN>abc<END>
> <BEGIN>abc\{<BEGIN>abc \{abc\}<END> abc\}<END> abc
> 
> Isso quer dizer que os $'s dentro de chaves não têm nada a ver com os
> que estão fora das chaves, e ainda pode haver múltiplas chaves uma
> dentro da outra; ou seja, é proibido ocorrer <BEGIN> ... \{  ...
> <END>.
> 
> Como faço isso? Não sei nem por onde começar.

   Com expressões regulares, apenas, não faz.
   Você precisa de um interpretador (parser) orientado ao contexto.
   Isso não pode ser implementado apenas usando uma linguagem regular 
(e.g.: expressões regulares).

   Aconselho a começar dando uma espiada na teoria de compiladores, para 
implementar sua gramática, e depois postá-la na lista para que a gente 
possa ajudar a torná-la uma Gramática Regular (se isso for possível) e 
ajudar a construir produções boas o bastante para capturar cada Token da 
sua Gramática e construir sua Árvore Sintática.

   Eu recomendo o livro de compiladores do Seti, Aho e Ullman, como a 
fonte de referências definitiva. É bem velhinho e pode ser encontrado 
(em versões em português) em praticamente qualquer biblioteca séria de 
universidade.
http://www.amazon.com/gp/product/0201100886/104-4860340-6749526?v=glance&n=283155

   Tem, também, como referência rápida, um artigo da Wikipedia:
   http://en.wikipedia.org/wiki/Compiler_theory

   Os links para outros websites são BEM interessantes.

   Pode interessar também a tradução para pt_BR do artigo da Wikipedia:
   http://pt.wikipedia.org/wiki/Compiladores

   Claro, está incompleta e precisa de ajustes, mas pode te dar uma luz.
   Eu vou tentar estabelecer produções suficientes para fazer o parse 
correto do seu problema, mas não garanto resultados imediatos.

   Espero que isso ajude. ;-)
   Putamplexos!
-- 
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  Luis Motta Campos is Software Engineer, Oracle OCP/DBA, Un*x
  Sysadmin, Member of {Lisbon,São Paulo,Cascavel,Brasil,London}
  Perl Mongers and Perl Fanatic Evangelist
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

		
_______________________________________________________ 
Abra sua conta no Yahoo! Mail: 1GB de espaço, alertas de e-mail no celular e anti-spam realmente eficaz. 
http://br.info.mail.yahoo.com/


Mais detalhes sobre a lista de discussão SaoPaulo-pm