Você está na página 1de 5

10 Introduzindo Tiny

Essa seo e responsvel por produzir um compilador real, para que funcione com
algumas lingues, denominando um conjunto Kiss para TINY, no desenvolvimento do
processo ser desenvolvido uma linguem quanto o compilador em uma abordagem de
top-down. Neste processo vai haver uma certa quantidade de nmeros de decises
para serem todas, cada uma influenciando a BNF.
Para comear a linguem que o autor teve em mente foi feita para compartilhar boas
caracterizas de Pascal, C e Ada. Sempre que aprimorado uma estrutura de linguem
ser delimitada por palavras chave ou smbolos. Uma das regras fundamentais
manter o compilador produzindo cdigo real e executvel, mesmo que ele no faa
muita coisa no comeo, pelo menos ele vai fazer corretamente. Pode ser feito alguns
testes de erro como omitir alguns valores, que acontece. Sempre que o compilador
inicia as entradas ilegais.
As Declaraes so o prximo passo que obviamente e decidir uma declarao. Foram
permitidos apenas declaraes globais como em C. Como s h um tipo de varivel,
no j necessidade de declarar o tipo, para a verso KISS pode ser adicionado uma
declarao do tipo prog. Cada varivel deve ocorrer num comando VAR separado.
Com isso tem a possibilidade de ter qualquer nmero de declaraes de dados, cada
uma comeando com um v de VAR.
A Declarao de smbolos em um compilador real iria diretivas assembly para alocar
ele na memria, com um cdigo extra, algo fcil de fazer na rotina, basta efetuar
uma modificao.
Nos indicadores no possvel inicializar os itens dados na declarao, para isso so
utilizadas duas verses de getneum. A primeira, retorna um valor em caracter de um
nico digito. A outra aceita valores inteiros multidigitos. Qualquer uma funcionara para
isso basta alterar a declarao no printf, com isso ser possvel inicializar diversas
variais com valor negativos com vrios dgitos.
A Tabela de smbolos, o compilador no faz nada para mercar uma vatiavel quando
declaramos, ele aloca espao para diversas variveis com com o mesmo nome.
Quando comeamos a referenciar variveis ele pernoitara que referencia mento
algumas que no existam, portando no possuindo uma tabela de smbolos para
armazenar certo tipos de dados, dever ser adicionados algumas declaraes ao iniciar
o programa.
Na parte de Analise Lxica tem de converter o programa para que ele trate de chaves e
palavras com mais de um caractere alm da quebra de linha e espaes em branco.
Para isso vai ser utilizado uma tcnica analise distribuda, a implementao nessa
etapa sera um pouco diferente por conta da forma que era tratar as quebras de linha,
para isso simplesmente sera permitidos os espaos, para poder ento entrar com um
programa que mais compreensvel. Em seguida sera tratado as quebras de linha. Que
na verdade um processo em dois passo. Se tudo estiver correto, estaremos prontos
para tratar dos tokens. Inicialmente deveremos adicionar declaraes adicionais, para
que finalmente ao fazer as alteraes para usar token ao invs de look como
caracter teste e chamar o scan nos lugares apropriados, isso envolve remover as
chamadas match, ocasionalmente trocando chamadas de match por chamadas a
matchstring e trocando chamadas a "newline" por chamadas a "scan". O fatoe que
com algumas pequenas excees temos um compilador usvel. Ainda que algumas
partes podem ser melhoradas.
Aps temos um linguem completa e funcionando poremos tratar da entrada e da
sada, a conveno dos dias, e prefervel a abordagem em E/S mesmo que no
tenhamos que fazer isso. Como de costume ser preciso mais rotinas de gerao de
cdigo, que por sinal so mais fceis, por que todo que temos que fazer chamar
rotinas de bibliotecas para fazer o trabalho.

11 - Anlise Lxica Revista

O conceito do novo analisador parecido com o clssico, mais no to simples que


antes, apenas de sua estruturar ser mais simples ela bem mais robusta e fcil de
aumente ou modificar, ele mais convencional que com genrico.
O problema comea na rotina de Block, pois em alguns casos ele no capaz de
tratar, pois a rotina scan espera e so consegue aceitar alguns tokens que comeam
com uma letra. Apesar desta conveno simples e muito til foi ter o tokens de uns
caracteres, fase sentido ao aplicar a mesmas regras de tokens multi-caracter.
Para solucionar esse problema ser preciso reintroduzindo as duas rotinas, que so
funcionalmente quase idnticos aos anteriores, para cada carga de token corrente,
tanto a ID como o nmero, no caractere global value. Eles tambm alteram token
para o cdico apropriado. A entrada deixada como o caracter look contendo o
primeiro caracter que NO parte do token. Amarrando algumas novas rotinas de
analise lxica, podemos comear a arrumar o compilador para utilizado. Em primeiro
lugar, o cogico para a rotina block no muda, mas sua funo sim.
Para concluir o resultante para TINY dado abaixo. Fora a remoo da palavra chave
PROGRAM, ele compila a mesma linguagem que antes. Com isso estamos perto de
estar aptos a escrever um compilador srio.

12 Miscelneas

Essa etapa relata sobre incurses laterais que no parecem se encaixa em outro lugar.
Sobre a tratativa de ponto e vrgula e comentrios, o ponto e virgula tem sido parte de
quase toda linguem moderna. Alguns erros comuns de compilao ocorreram por ele
estar mal posicionado ou omitido de qualquer outra coisa, levou tempo para
acostumasse a utiliza-lo pois no sabia sua necessidade, no decorrer do
desenvolvimento do Kiss, vou questionado CADA na tentiva de evitar a maioria dos
problemas comuns que ocorrem nelas, por isso foram adicionado o ponto e vrgula nas
primeiras posies da lista.
O embelezamento sinttico, foram adicionados a linguagem no por serem necessrio
mas para ajudar que o programa parea correto para o programador, Um bom
exemplo de embelezamento o prprio ponto e vrgula.
O Tratamento do ponto e vrgula, foi definido duas utilizaes para ele ele pode ser
considerado um SEPARADOR por exemplos, das duas sintaxes, a do Pascal parece ser a
mais racional, pois muitos programadores tratam como se tivesse uma varivel null
em seguida. Portando esse escolha acabou sendo melhor.
Concluindo temos a habilidade de lidar com comentrios e ponto-e-vrgula, como
tambm outros tipos de "embelezamento sinttico". Por algumas raoes como ele ser
um TERMINADOR e no um separador, ele ser OPCINAL, comentrio delimitados e
aninhados.
13 Procedimento

Considerado a melhor parte do projeto, nesse ponto e estudado quase todas as


caractersticas bsicas dos compiladores, anlise lxica e sinttica. Com o compilador
deste podemos escrever simples software que pode ler valores inteiros em sua
entrada, e executar clculos e processamentos com certa complexidade, e produzir
resultados de sada. Nessa etapa ser tratado os procedimentos.
Um timo desvio, efetuando experincias, foi preciso abandonar a tcnica que foi to
til e que permitiu a chegada at esse ponto, foi incremental ao compilador TINY
completo. Basicamente todas as CPUs modernas do suporte a chamadas de
procedimentos, e o 80x86 no exceo. Para o 80x86 da instruo CALL seu retorno
RET. Uma para as experincias e um software para que no seja preciso a compilao
do TINY completo. Na maior parte do programa so as rotinas padro do "bero". Para
chamar o procedimento existe duas sintaxes BNF comeam com o mesmo token
<identifier> do lado direito. Como podemos saber, quando vemos um identificador.
A passagem de parmetros e feito da seguinte forma, levando em considerao que
todos ns conhecemos a ideia bsica da passagem de parmetros, mas vamos revis-la
s para ter certeza. Quando um procedimento chamado, os "parmetros
verdadeiros" passados para ele so associados com os parmetros formais, em uma
base de um-para-um. Repare que j existe uma deciso implcita nesta sintaxe.
Algumas linguagens, como Pascal e Ada, permitem que a passagem de listas de
parmetros seja opcional. Se no houver parmetros, voc simplesmente no coloca
os parnteses. Outras linguagens, como C e Modula-2, exigem os parnteses mesmo
que a lista esteja vazia. Claramente, o exemplo que acabamos de completar
corresponde ao primeiro ponto de vista. Mas para dizer a verdade eu prefiro o
segundo. Para os procedimentos em si, a deciso parece favorecer a abordagem "sem
lista". desnecessrio dizer, que fcil acomodar qualquer um dos pontos de vista
conforme projetamos a linguagem, portanto estritamente um problema de
preferncia pessoal. Faa da forma que voc achar melhor.
A passagem por valor, quase sempre a nica forma razovel de se passar dados
atravs da pilha da CPU. Isso certamente no e complexo.
Quando se chama a execuo, a CPU coloca o endereo de retorno na pilha e pula
desvia para FOO. E preciso inicializar uma nova tabela, lembrando que a lista de
parmetros formais diferente para cada procedimento. A definio de nossa
definio de procedimentos atual no permite o uso delas. Nem necessrio falar que
isto uma grande falta da nossa linguagem, e uma que deve ser corrigida.
At ento sabemos compilar delaes e chamadas de procedimentos, com parmetros
passados por referncia e por valor. Voc j sabe tambm, como possvel tratar de
variveis locais, alocadas esttica e dinamicamente. J que uma vez tomadas decises,
o cdigo para traduzir as construes no realmente to difcil.

14 Tipos

Como mencionando nos captulos anteriores, esta etapa retrata sobre a maneira de
lidar com os tipos de dados diferente e falando dos tipos simples e predefinidos. No
ser tratado dos valores. Aps a escolha entre a qualidade de cdigo e evitar a
complexidade, e como de costume eu procuro optar pela abordagem mais simples. O
plano, de fato, ter TRS compiladores: Um para a verso de um caractere de TINY
(para usar nas experincias), um para TINY completo, e outro para KISS. Neste ponto
eu isolei as diferenas entre TINY e KISS, que so as seguintes: TINY ter suporte a
apenas dois tipos de dados: o caractere e o inteiro de 16-bits. Eu posso tentar fazer
algo com strings tambm, j que sem elas um compilador no seria de grande
utilidade. KISS vai suportar todos os tipos simples usuais, incluindo vetores e at
mesmo nmeros de ponto flutuante. - TINY s ter duas construes de controle, o IF
e o WHILE. KISS vai suportar um conjunto bem mais rico de construes, incluindo uma
que no discutimos ainda... o comando CASE. KISS ter suporte a mdulos compilados
separadamente.
O ideal um desenvolvimento de um programa teste que no faz nada a no ser
inicializar, para que em seguida possa exibir a tabela, para que possamos ter a certeza
que esto em sintonia. Por outro lado, as converses explicitas podem ser dolorosas
por exemplo se for adicionado 1 a um caractere, ao aplicar o operao com uma
mscara, j um serie de converses que deveram ser feitas. Caso algo sai errado so
teremos uma mensagem Tipos no so compatveis mais pode acontecer de o
compilador no dizer exatamente quais so os tipos compatveis, apenas setar a linha
com erro.
Por Razes simples ele no devera suportar aritmtica com e sem sinal, por que isso
iria dar uma certa complexidade converses de alguns tipos.
As operaes lgicas devem ser entendidas como inteiros sem sinal, portanto as
converses sem sinal so necessrias de qualquer maneira.

15: De volta para o futuro

O conceito chave a ideia de uma entrada com um carter "lookahead. Todas as rotinas
examinam este caractere, sem alter-lo, para decidir o que devem fazer em seguida, ser
traduzido o conceito em nossa organizao por mdulos. A primeira unidade entra o
cabealho e o arquivo de implementao que define as funes. Caso no faa a incluso do
cabealho ter um erro de compilao tambm preciso juntar os mdulos depois da
compilao separada, para obter o programa executvel. E preciso lembrar que como foi feito
antes, o mdulo de entra e sempre foi considerado como uma simplificao de um mdulo
real. Em um compilador de produo, a entrada ser proveniente de uma arquivo ao invs do
teclado. E certamente isto vai incluir um buffer para melhorar a eficincia de entradas do
disco. A melhor parte dos mdulos separados, como na prpria orientao a objetos em si,
que podemos modificar o cdigo em uma unidade para que ele seja to simples ou to
sofisticado. J que esta j faz parte da nossa verso multi-caracter, convm copiar todos os
arquivos para um diretrio diferente (eu escolhi o nome MULTI), alterando "scanner1.h" e
"scanner1.c" para "scanner.h" e "scanner.c". Copie o cdigo da unidade anterior OBSERVANDO
a mudana dos nomes das unidades e adicione as rotinas abaixo. No esquea de alterar a
definio de seus prottipos no cabealho.

Apesar da relativa simplicidade dos dois analisadores, foi preciso pensar muito para chegar
neles, e muitas decises foram tomadas. Eu gostaria de compartilhar algumas destas idias
com voc para que voc possa tomar suas prprias decises, apropriadas para a sua aplicao.
Primeiro, note que as duas verses de "getName" convertem os caracteres de entrada para
letras maisculas. Obviamente, houve uma deciso feita aqui, e um dos casos em que a
sintaxe da linguagem acaba envolvendo o analisador lxico tambm. A linguagem C sensvel
a diferenas de letras masculas e minsculas. Para uma linguagem como esta, obviamente no
podemos converter todos os caracteres para maiscula. O projeto que estou usando assume
uma linguagem como Pascal, onde masculas e minsculas no tem diferena. Para tais
linguagens, mais fcil fazer esta converso no analisador lxico, para que no tenhamos que
nos preocupar mais tarde com comparao de strings.

Como se trata de um nmero, a abordagem que vem mente imediatamente retornar o


nmero como um inteiro. Mas lembrando que o eventual uso do nmero ser num comendo
de escrita que ser usado no mundo exterior. Alm disso, como voc logo vai ver, vamos
precisar de um local temporrio para armazenar o valor do token que acabamos de ler. Se
armazenarmos o nmero na forma de string, podemos armazenar o nome de uma varivel ou
um nmero na mesma string. De outra forma, teramos que criar uma segunda varivel de tipo
inteiro.

Sem alterao no cdigo principal possvel verifica que o programa est processando
variveis e fatores constantes. Neste ponto, nossa estrutura est quase completa; j temos
mdulos para fazer todo o trabalho, com o cdigo suficiente.