SNOBOL: uma linguagem para manipulação de strings

SNOBOL: uma linguagem para manipulação de strings: notas rápidas sobre o artigo original de 1964 e exemplo prácticos

SNOBOL (StriNg Oriented symBOlic Language) é uma linguagem de programação para manipulação de strings1. Um comando em SNOBOL consiste numa regra que opera sobre strings. As operações básicas são: a formação de uma string, procura de padrões e substituição2.

Aparentemente a versão actual do SNOBOL é a SNOBOL4 que não contém algumas das coisas mais interessantes, na minha opinião, que são específicas desta linguagem, tais como o uso do "espaço-em-branco" como operador. Aliás foi esta a propriedade, entre outras, que potenciou a evolução do SNOBOL até à versão 43.

Um exemplo olá-mundo:

        output = 'hello world'
end

A estrutura completa de um programa em SNOBOL consiste num conjunto de regras que podem ser organizadas em cinco partes: um campo etiqueta, que pode ou não estar presente, na coluna 1; uma string de referência; o padrão; o campo de substituição que começa com o sinal de igual; um campo de go-to que começa com dois pontos. O exemplo seguinte contém os 5 campos referidos anteriormente que serve para retirar os espaços em branco de um conjunto de caracteres:

alpha X ' ' = :s(alpha)
O programa seguinte retira todos os espaços à frase 'As armas e os barões assinalados'
    str1 = 'As armas e os barões assinalados'
l1  str1   ' ' = :s(l1)
    output = str1
end
O output é a string 'Asarmaseosbarõesassinalados'.

A implementação de comandos condicionais, ou simplesmente condições, é feita recorrendo à instrução go-to e aos labels (etiquetas). O exemplo seguinte mostra como funciona.

   quote = '"'
   vogal = 'a'
   str1 = 'As armas e os barões assinalados'
   str1   vogal :s(l1)f(l2)
l1 output = 'A frase ' quote str1 quote ' contém um ' quote vogal quote
l2 output = 'A frase ' quote str1 quote ' não contém um ' quote vogal quote
end
o resultado é: A frase "As armas e os barões assinalados" contém um "a". E de uma forma semelhante
   quote = '"'
   vogal = 'a'
   str1 = 'As armas e os barões assinalados'
   str1   vogal :s(l1)f(l2)
l1 output = 'A frase ' quote str1 quote ' contém um ' quote vogal quote
l2 output = 'A frase ' quote str1 quote ' não contém um ' quote vogal quote
end
obtém-se como resultado a frase "A frase "As armas e os barões assinalados" não contém um "u"".

Os programas aqui descritos estão disponíveis para download.

O exemplo seguinte calcula o factorial de um número inteiro

      nini = 3
      n = nini
      factorial = 1
l1    ge(n, 1)  :s(l2)f(l3)
l2    factorial = n * factorial  b.       n = n - 1 :(l1)
l3    output = 'O factorial de ' nini ' é igual a ' factorial
end
e o resultado é a frase "O factorial de 3 é igual a 6". Ou ainda na forma mais simples
      nini = 3
      n = nini
      fact = 1
l1    fact = n * fact
      n = ge(n,2) n - 1 :s(l1)f(l2)
l2    output = fact
end
Ou ainda definindo a função factorial
              define('factorial(n)') :(factorial.end)
factorial     factorial = eq(n,0) 1 :s(return)f(factorial2)
factorial2    factorial = n * factorial(n - 1) :(return)
factorial.end

test output = factorial(3)
end

O método de Herão já descrito nestas páginas fica assim:

       i = 10
       x = 2.0
       y = 1.0
heron0 i = ge(i,1) i - 1 :s(heron1)f(end)
heron1 output = 'A ' 10 - i  '-ésima iteração do método de Herão é igual a ' y
       y = (y + (x / y)) / 2 :(heron0)
end
e o output é
A 1-ésima iteração do método de Herão é igual a 1.
A 2-ésima iteração do método de Herão é igual a 1.5
A 3-ésima iteração do método de Herão é igual a 1.41667
A 4-ésima iteração do método de Herão é igual a 1.41422
A 5-ésima iteração do método de Herão é igual a 1.41421
A 6-ésima iteração do método de Herão é igual a 1.41421
A 7-ésima iteração do método de Herão é igual a 1.41421
A 8-ésima iteração do método de Herão é igual a 1.41421
A 9-ésima iteração do método de Herão é igual a 1.41421
A 10-ésima iteração do método de Herão é igual a 1.41421

Outra característica do SNOBOL é a referência indirecta. Consideremos o programa seguinte

      a = 'b'
      b = 'c'
      output = $a
end
O output é a letra 'c'. O comando
 output = $a
significa "encontra o valor de a; considera este valor como nome de uma variável; encontra o valor dessa variável e dá cá para fora (output) o seu valor".

Uma implementação do jogo das Torres de Hanoi

       define('hanoi(n,ns,nd,ni)')  :(hanoi.end)
hanoi  eq(N,0)                      :s(return)
       hanoi(n - 1,ns,ni,nd)
       output = 'Move disc ' n ' from ' ns ' to ' nd
       hanoi(n - 1,ni,nd,ns)         :(return)
hanoi.end

test   hanoi(5,'A','C','B')
end
o output é
Move disc 1 from A to C
Move disc 2 from A to B
Move disc 1 from C to B
Move disc 3 from A to C
Move disc 1 from B to A
Move disc 2 from B to C
Move disc 1 from A to C
Move disc 4 from A to B
Move disc 1 from C to B
Move disc 2 from C to A
Move disc 1 from B to A
Move disc 3 from C to B
Move disc 1 from A to C
Move disc 2 from A to B
Move disc 1 from C to B
Move disc 5 from A to C
Move disc 1 from B to A
Move disc 2 from B to C
Move disc 1 from A to C
Move disc 3 from B to A
Move disc 1 from C to B
Move disc 2 from C to A
Move disc 1 from B to A
Move disc 4 from B to C
Move disc 1 from A to C
Move disc 2 from A to B
Move disc 1 from C to B
Move disc 3 from A to C
Move disc 1 from B to A
Move disc 2 from B to C
Move disc 1 from A to C

Notas

1. Não vou traduzir string porque não tenho melhor substituto em português.

2. Farber, Griswold e Polonsky -- "SNOBOL, A String Manipulation Language", J. Ass. Comp. Mach. vol. 11, n. 2 (Jan, 1964), pp. 21-30

3. Estou ainda è espera de uns livros para confirmar isto mesmo, no entanto, já confirmei a existência do operador espaço-em-branco em A Snobol4 Tutorial.

Refs:

Farber, Griswold e Polonsky -- "SNOBOL, A String Manipulation Language", J. Ass. Comp. Mach. vol. 11, n. 2 (Jan, 1964), pp. 21-30

W. Douglas Maurer, "The programmer's introduction to SNOBOL", New York: American Elsevier Pub. Co., c1976. x, 141 p.; 24 cm.

Palavras chave/keywords: SNOBOL, strings, exemplos

Última actualização/Last updated: 2014-02-20 [14:36]


1999-2014 (ç) Tiago Charters de Azevedo

São permitidas cópias textuais parciais/integrais em qualquer meio com/sem alterações desde que se mantenha este aviso.

Verbatim copying and redistribution of this entire page are permitted provided this notice is preserved.