Percursos
/
Tcl
Tcl
/
Exercícios
/
Parênteses correspondentes
Parênteses correspondentes

Parênteses correspondentes

Fácil

Introdução

Tens a oportunidade de escrever software para o Bracketeer™, um mainframe antigo mas poderoso. O software que nele corre está escrito numa linguagem proprietária. Grande parte da sua sintaxe é familiar, mas reparas que há imensos parênteses retos, chavetas e parênteses. Apesar de o Bracketeer™ ser poderoso, falta-lhe flexibilidade. Se o código-fonte tiver parênteses retos, chavetas ou parênteses desequilibrados, o Bracketeer™ avaria e tem de ser reiniciado. Para evitar esse cenário, começas a escrever código capaz de verificar se os parênteses retos, as chavetas e os parênteses estão equilibrados antes de tentares executá-lo no Bracketeer™.

Instruções

Dada uma string que contém parênteses retos [], chavetas {}, parênteses (), ou qualquer combinação destes, verifica se todos os pares estão corretamente emparelhados e aninhados. Quaisquer outros carateres devem ser ignorados. Por exemplo, "{what is (42)}?" está equilibrado e "[text}" não está.

O Tcl é uma linguagem muito simples, mas a forma como o intérprete analisa o código tem alguns casos-limite desagradáveis.

Chavetas

As chavetas em Tcl são apenas uma forma de delimitar um bloco de texto: esse texto pode ser interpretado como código ou como dados. Dentro das chavetas podem aparecer chavetas aninhadas, mas essas chavetas aninhadas têm de estar equilibradas. A página de manual do Tcl diz o seguinte:

As chavetas aninham-se dentro da palavra: por cada chaveta de abertura adicional tem de haver uma chaveta de fecho adicional (no entanto, se uma chaveta de abertura ou de fecho dentro da palavra estiver escapada com uma barra invertida, não é contabilizada ao localizar a chaveta de fecho correspondente).

A redação é bastante específica: se quiseres ter um caráter de abertura ou de fecho de chaveta sem par, tens de o escapar com uma barra invertida. Por isso, não faças isto:

proc isOpenBrace {char} {
    return [expr {$char eq "{"}]
    # ......................^ will not work
}

Tens de fazer isto

proc isOpenBrace {char} {
    return [expr {$char eq "\{"}]
    # ......................^^ will work
}

Isto pode ser problemático devido à forma como o Tcl analisa os comentários, que é diferente da maioria das linguagens. Há mais discussão na wiki do Tcl.

Parênteses retos

Da mesma forma, como o Tcl usa parênteses retos para a substituição de comandos, mesmo dentro de strings entre aspas duplas tens de ter cuidado ao escapar parênteses retos de abertura.

Parênteses

Com exceção das variáveis de array associativo, os parênteses são simplesmente carateres comuns.


Fonte

Ginna Baker
Editar via GitHub A ligação abre numa nova janela ou separador
Tcl Exercism

Estás pronto para começar Parênteses correspondentes?

Inscreve-te no Exercism para aprenderes e dominares Tcl com 135 exercícios, e mentoria humana real, tudo grátis.