[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