# Tom (informática)

TOM é um ambiente de software para definir transformações em estruturas de árvore/termos e documentos XML. Tais definições são construídas como uma extensão TOM. São adicionadas construções TOM (primitivas) à linguagens como C, Java e OCaml. TOM também suporta o uso de regras de reescrita.
Tom é útil para:
* programação por casamento de padrões
* desenvolvimento de compiladores e DSL (Domain Specific Language)
* transformação de documentos XML
* implementação de sistemas baseados em regras
* descrição de transformações algébricas
Em Java, a integração é simples, permitindo o uso de bibliotecas quaisquer existentes sem nenhuma restrição.

## Casamento de padrões

Em ciência da computação, casamento de padrões (Pattern Matching) é o ato de verificar se existe a presença de um dado padrão, diferente de reconhecimento de padrões, onde o padrão é especificado previamente. Casamento de padrões é usado para testar se algo tem uma estrutura desejada, para encontrar estruturas relevantes, para obter o casamento de termos, e também para substituir uma determinada estrutura por outra que seja correspondente.
Sequência de padrões são frequentemente descritas usando expressões regulares, e são casadas usando um determinado algoritmo.

## Linguagem-base

Esta seção apresentará noções básicas da linguagem TOM, por exemplo, a definição de tipo de dados, a construção de dados (árvore sintática), e a transformação desses dados usando casamento de padrões.

### Definindo um tipo de dado

Um dos mais simples programas TOM é definido como segue: em um tipo de dado para representar números naturais (Peano) é construído os inteiros 0 = zero e 1 = suc(zero);

### Construção %gom

Note que a construção %gom{...} define a estrutura de dado, também chamada de assinatura. Esta estrutura declara um tipo (Nat) que tem três operadores (zero, suc e plus). Estes operadores são chamados de construtores, pelo fato deles serem usados para construir a estrutura de dados.
Este código é salvo com uma extensão .t (Main.t) e depois compilado com o compilador tom. Como resultado da compilação serão gerados arquivos Java contendo o código que representa do tipo de dado Nat definido na estrutura gom, e também o arquivo Main.java com o código a ser executado.

### Construção %match

O construtor %match é similar ao switch/case no sentido que, dada uma árvore (n) qualquer, o construtor seleciona o primeiro padrão que casa com a árvore, e executa a ação associada. Por matching, significa que ao se atribuir valores a variáveis para fazer o padrão ser igual ao sujeito. No nosso exemplo, n tem o valor plus(suc(zero),suc(zero)). O primeiro padrão não casa com n, por que o segundo termo de n não é um zero, mas um suc(zero). Neste exemplo, o segundo padrão casa com n, e dá os valores suc(zero) para x, e zero para y.
Quando um padrão casa com o sujeito, é dito que as variáveis (x e y no nosso caso) são instanciadas. Elas podem então serem usadas na ação (método específico). Ne maneira similar, a segunda regra pode ser aplicada quando o segundo subtermo é definido como root por suc. Neste caso, x e y são instanciadas.

### Compilando com TOM

Presumindo que o TOM está instalado (variáveis de ambiente configuradas), basta usar o comando: tom Main.t, para compilar o arquivo TOM. Logo após, compile o arquivo Java gerado usando o comando: javac Main.java, e por fim execute o programa usando o comando: java Main, a saída é apresentada nas linha 5 e 6 do código abaixo.

## Usando regras

Esta seção irá apresentar a noção de regras com o objetivo de simplificar expressões. Suponha que é necessário simplificar expressões booleanas. Este tipo de simplificação é definida através de relações entre expressões usando um conjunto de regras de simplificação. O código abaixo apresenta algumas regras de simplificação para expressões booleanas.
Para usar estas regras em uma estrutura TOM, é necessário definir tal conjunto de regras na estrutura %gom . A construção %gom provê uma seção rule, onde ambos, o lado esquedo e direito das regras são termos. O código apresentado abaixo é definido em um arquivo .gom que implementa e adiciona regras ao tipo Bool.