Interpretador de scripts - Manual preliminar

1. Descrição geral

O programa scripvox é um interpretador de linguagem de comandos
que permite um controle de execução de sequencias de ações controladas
por um programa.  Poderiamos pensar que é um equivalente dos antigos
comandos .BAT do MSDOS, mas com um poder tremendamente aumentado,
e adequado ao processamento no Windows.

As ações que podem ser executadas foram talhadas para possibilitar
a criação de interfaces sonoras para deficientes visuais.  A linguagem
e' facílima de ser aprendida, mas tem muitas facilidades que tornam
muito poderosa essa ferramenta.

A linguagem foi criada para ser absolutamente simples de ser
programada, quando o problema é simples.  Desta forma, se acredita
que um se crie um número grande de "programadores curiosos", gente
que não teria a paciência para aprender uma linguagem convencional
de computação ao ponto de criar alguma coisa útil.

A linguagem pode ser pensada também como "a primeira linguagem" do
aprendiz de programação, possibilitando que com um conhecimento
muito rudimentar de programação, um estudante crie programas de
interface que atuem sobre outros programas, possibilitando resultados
muito interessantes e criativos.

Nota:

É importante que se ressalte que um script tem escôpo de funcionamento
com lógica muito mais simples do que um programa convencional, escrito
em Pascal ou outra linguagem qualquer.  Assim, a linguagem não possui
comandos poderosos de controle, as variaveis são todas do mesmo tipo
(cadeias de caracteres) e o tratamento de rotinas não permite o uso
de parâmetros.  Da mesma forma, o tratamento aritmético é rudimentar.
Entretanto, um programa que em Pascal poderia consumir 500 linhas
ou mais pode ser escrito provavelmente em menos de 100 num script.

2. Funcionamento geral

Um script de comandos é um arquivo de texto com extensão .CMD.
Para ativa-lo no Winvox existem duas opções:

a. Localizar o arquivo .CMD desejado com a opção de arquivos e executar
   este arquivo com a opção x

ou então

b. Ativar o utilitário scripvox (opção U S) e informar o nome completo do
   arquivo .CMD de script

Nota sobre a instalação:

Deve-se assegurar que o arquivo \windows\dosvox.ini contenha as seguintes
linhas

[DOSVOX]
PROG.CMD=c:\winvox\scripvox.exe

[PROGUTIL]
Util16=S,c:\winvox\scripvox.exe,-DVUTSCRI,Executor de script de comandos

3. Estrutura de programação

a) Formato do programa

O programa é um texto comum.
Os comandos podem vir em maiúsculos ou minúsculos, com ou sem acentos.
As linhas podem ter até 256 letras.
Linhas em branco são ignoradas
Uma linha começada por asterisco é também ignorada (comentários)
Os brancos ao início da linha são desprezados, possibilitando a
utilização de endentação nos programas.

b) Funcionamento

As instruções do programa são executadas sequencialmente, linha
após linha.  As únicas exceções são os comandos que promovem
explicitamente um desvio no fluxo normal de execução, a saber:
desvia, se, chama e retorna.   Veremos o funcionamento destes
comandos mais adiante.

O programa permite o registro de informações nas chamadas "variaveis",
que são identificadas por uma única letra, de A até Z.  Assim, um
programa pode conter no máximo 26 variáveis.

As variáveis podem conter cadeias de caracteres de até 255 letras.
Números são tratados internamente como se fossem cadeias de caracteres
(ligeiramente particularizadas).

4. Um primeiro exemplo

Para que se tenha uma breve idéia da cara de um programa
vejamos o trecho abaixo.

* Meu primeiro programa
escreve "Oi amigo, qual seu nome?"
le n
escreve "Muito prazer, "&
escreve n
escreve "Realmente não é nada difícil programar"

A primeira linha é um comentário, e é ignorada pelo interpretador.
Em seguida a frase
Oi amigo, qual o seu nome ?
é mostrada numa janela e sintetizada em voz.
A seguir o usuário deve teclar uma resposta apertando depois Enter.
Este resposta será armazenada na variável n
A máquina vai então falar
Muito prazer,
(o indicador & diz que não se deve pular linha após essa escrita)
colocar ao lado o que foi teclado pelo usuário, armazenado internamente
na variável n, pular de linha (pois este comando escreve não possui uma
letra & ao final) e finalmente escrever
Realmente não é nada difícil programar

Antes de prosseguir digite este texto, e o execute.

5. Desvios

É possível inserir no texto do programa linhas começando pela
letra @, seguidas (sem espaço em branco) por uma palavra.
Essas linhas são chamadas de "rótulos" e servem para que se
possa desviar a execução para uma delas.

O trecho a seguir ilustra um desvio

escreve "Digite uma palavra e eu repetirei"
escreve "Termine com a palavra FIM"

@outraPalavra
    le t
    escreve t
    se t = "FIM" desvia @fim
    desvia @outraPalavra

@fim
escreve "Tchau"

Notas sobre estilo:
É comum inserir-se uma linha em branco antes de um rótulo
para aumentar a legibilidade do programa.
Quando os comandos de desvio provocam uma repetição de
um trecho é usual que ele seja destacado através da inserção
de alguns espaços em branco em todas as linhas (indentação).

6. Comandos

Na descrição simplificada abaixo, o uso de chaves indica
um item adicional e o de colchetes, um item obrigatório.

6.1 Interações com o usuário

a)  escreve {MUDO} ["frase" ou variavel]

Escreve um texto, sintetizando simultaneamente.  Se a palavra
MUDO estiver contida, ele não é sintetizado, apenas escrito.
Quando o comando é terminado por &, nao pula linha.

exemplos:
    escreve "Oi"
    escreve "Eu me chamo " &
    escreve "Antonio Borges"
    seja a "Nasci em 1956"
    escreve a

b) le [variavel]

Obtém do teclado uma cadeia de caracteres para uma variavel.
Quando o comando é terminado por &, apenas uma letra é lida.

exemplos:
    le a
    le c&

c) tela [LIMPA ou MINIMIZADA ou NORMAL ou @x,y]

Controla a aparência da janela ou reposiciona o cursor nela.
A opções Minimizada serve para tirar a janela do script da
área visível, dando, provavelmente a vez para uma outra janela
que esteja abaixo dela.  A opção Normal traz para a atividade
uma janela de script que esteja minimizada ou escondida atrás
de outra.

Exemplos:
    tela LIMPA
    tela @10,10
    escreve "oi"
d) bipa {tipoBip}

Soa um bip ou clek.
Se o tipo do bip for omitido será emitido um bip.
Caso contrário, 0 = bip  1 = clek

e) cor [valor ou variavel]
   fundo [valor ou variavel]

Cores válidas:
  Preto          = 0
  Azul           = 1
  Verde          = 2
  Ciano (Azul)   = 3
  Vermelho       = 4
  Magenta        = 5
  Marrom         = 6
  Branco fosco   = 7
  Cinza escuro   = 8
  Azul claro     = 9
  Verde claro    = 10
  Ciano claro    = 11
  Vermelho claro = 12
  Magenta Claro  = 13
  Amarelo        = 14
  Branco         = 15

Escreve com a cor ou o fundo de letra dados, a partir deste momento.
Para desenhar usando uma janela colorida, use o comando fundo
seguido do comando tela limpa.

Exemplos:
    COR 4
    ESCREVE "Estou escrevendo este texto em vermelho"
    Fundo 9
    ESCREVE "Vermelho em fundo azul claro"
    FUNDO 0
    COR 7
    TELA LIMPA

f) observa TECLADO [variavel]

A variável selecionada recebe um dos seguintes valores
    0: não foi teclado nada
    1: teclado requer leitura, foi teclado algo

Exemplo:

@maisUmBip
    bipa 1
    observa TECLADO x
    se x = 0 desvia @maisUmBip
le a &

O exemplo acima fica loucamente clekando até que o usuário aperte uma tecla.




{
{    Operações com arquivo
{        abre #n ["nomeArquivo" ou variavel]     {terminado por & arquivo e' criado ou acrescentado se existir
{        fecha #n
{        le #n variavel
{        escreve #n [variavel]                 {terminado por & nao pula linha
{        remove ["nomeArquivo" ou variavel]    {terminado por & não dá erro se não apagar
{        renomeia ["nomeArquivo" ou variavel] ["valor" ou variavel]
{                                              {terminado por & não dá erro se não renomear
{        busca [variavel] [DIR] [["nomeArqs" ou variável] ou PRÓXIMO]
{                            { se omitido nome ou PRÓXIMO devolve diretório atual
{        dir [CRIA, REMOVE] ["nomeDiretorio" ou variavel]  {terminado por & não dá erro
{        checa [variavel]          {resultado da última operacao le, escreve
{                                  {0: Não houve problemas    > 0: erro
{
{    Operações com Internet
{        internet [INICIA, TERMINA]
{        conecta #n ["valor" ou variavel] ["porta" ou variavel]
{        serve #n ["porta" ou variavel]
{        observa #n [variavel]    {0: porta não requer atenção   1: requer leitura
{
{    Processamento de desvios
{        executa ["programa" ou variavel]     {terminado por & nao espera terminar
{        desvia [rotulo]
{        chama [rotulo]
{        retorna
{        se [NÃO] [variavel] [comparador] ["valor" ou variavel] comando
{        cmd [variavel]
{        termina [mudo]
{        debug [-]
{
{    Processamento de variáveis
{        seja [variavel] [funcaoOpcional] [valor ou variavel]
{        soma [variavelDest] [valor ou variavel]
{        concatena [variavelDest] [valor ou variavel]
{        copia [variavelDest] [variavel] [caracinicio] [caracfim]
{        transfere [DE, PARA] [variavel]
{        substitui [variavel] [valor antigo] [valor novo]
{
{    Operações com janelas
{        espera [tempoEmSegundos]
{        espera [tempo] ["nome janela" ou variavel]
{        janela [FECHA, MINIMIZA, MAXIMIZA, NORMAL] ["nome janela" ou variavel]
{        captura [TÍTULO ou ATIVA, CAMPO, FOCO] [variavel]
{
{    Ações do teclado e mouse
{        digita "frase" [enter]
{        aciona [tecla virtual]
{        clica [duplo] [onde]
{
{    Ações de multimídia
{        toca "frase" ou variável                 {terminado por & nao espera terminar
{        mci [variavelRetorno] ["frase" ou variável]
{
{------------------------------------------------------------------------------------------}
{
{    [valor]     "cadeia de caracteres"
{    [funcaoOpcional]    TAMANHO, MAIUSC, TRIM, POS [variavel ou valor]
 {    [variavel]  letra de a-z (maiusculas = minusculas)
{    [comparador] '=' '<>' '<' '>' '>=' '<='
{                 '==' '*=*' '=*' '*='
{    [rotulo]  qualquer coisa começada por '@'
{    [arquivo]  frase ou variavel
{    comentario: linha começada por *
{    [Onde]
{        x, y
{        tela x, y
{
{------------------------------------------------------------------------------------------}

