Escolar Documentos
Profissional Documentos
Cultura Documentos
Manual G-Portugol PDF
Manual G-Portugol PDF
Thiago Silva
thiago.silva@kdemail.net
8 de abril de 2006
Sumrio
1 Introduo 1
2 Caractersticas Gerais 2
2.1 Tipos de dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
2.2 Estruturas de controle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
2.3 Subprogramas (funes) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
3 Programando em G-Portugol 4
3.1 Ol Mundo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
3.2 Variveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
3.2.1 Variveis primitivas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
3.2.2 Vetores e matrizes (conjuntos) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
3.3 Estruturas condicionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
3.4 Estruturas de repetio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
3.4.1 A estrutura enquanto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
3.4.2 A estrutura para . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
3.5 Funes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.5.1 Funes internas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
5 O programa GPT 19
5.1 Intruduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
5.2 Opes gerais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
5.3 Tratamento de erros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
5.4 Execuo de programas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
5.4.1 Compilao e gerao de cdigo executvel . . . . . . . . . . . . . . . . . . . . . . . 20
5.4.2 Traduo para a linguagem C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
5.4.3 Interpretao de cdigo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
5.4.4 Processando algoritmos divididos em multiplos arquivos . . . . . . . . . . . . . . . . . 21
1
A Gramtica da linguagem G-Portugol 23
A.1 Termos lxicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
A.2 Gramtica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
Resumo
Esse no um livro que ensina programao, algoritmos ou lgica. Seu objetivo servir de manual
para a linguagem G-Portugol e ferramentas relacionadas. Portanto, ele assume que o leitor seja versado
em linguagens de programao e desenvolvimento de software.
Captulo 1
Introduo
G-Portugol 1
Captulo 2
Caractersticas Gerais
Tipos primitivos
Tipo Exemplos
inteiro 19
real 2.5
caractere a
literal uma frase
lgico verdadeiro
Com esses tipos, pode-se criar conjuntos como vetores ou matrizes n dimensionais. Tipos mais
complexos no so suportados.
G-Portugol 2
Captulo 2. Caractersticas Gerais
Estruturas de controle
Estrutura Tipo
se/ento/seno/ condicional
enquanto repetio
para repetio
G-Portugol 3
Captulo 3
Programando em G-Portugol
A proposta desse captulo mostrar os elementos da linguagem G-Portugol usando programas como
exemplos. No um captulo sobre como programar, nem tem como intuito ensinar algortmos. Portanto,
esperado que o leitor seja familiarizado com programao.
3.1 Ol Mundo
Mantendo a tradio, vamos criar nosso primeiro programa. O propsito dele ser exibir na tela o texto
"Ol mundo". Crie um arquivo chamado "olamundo.gpt"com o seguinte contedo:
algoritmo olamundo;
incio
imprima("Ol mundo!");
fim
No linux:
Como j deve ter assumido, comentrios ao estilo C (/**/) e C++ (//) so permitidos e o que estiver entre
aspas duplas (") tratado como uma string ou constante literal. Escapes so permitidos como EOL (\n),
tabulao (\t) dentre outros. No permitido a concatenao em multiplas linhas como na linguagem C:
G-Portugol 4
Captulo 3. Programando em G-Portugol
Outro detalhe a pontuao. Da mesma forma que em C, o ; utilizado como finalizador de enuncia-
dos.
3.2 Variveis
A declarao de variveis deve ser feita dentro de um bloco especfico, que deve aparecer logo aps a
declarao do algoritmo. O bloco iniciado pela palavra-chave variveis (sim, com acento) e termina
com a palavra chave fim-variveis. Pelo menos uma varivel deve ser declarada dentro do bloco (embora
o bloco em si seja opcional) e apenas um bloco em escopo global deve ser declarado. Eis um exemplo
para estudo:
variveis
x : inteiro;
nome : literal;
fim-variveis
incio
fim
Isso , um ou mais identificadores separados por virgula, seguido de um :, seguido de um tipo, se-
guido, finalmente, de ;. Como pode-se notar, parecido com Pascal. Assim que um programa execu-
tado, todas as variveis, primitivas ou vetores/matrizes, declaradas so iniciadas com um valor nulo ou 0
automaticamente. Vale ressaltar que constantes (const, final, etc) no so suportados. Os tipos primitivos
suportados encontram-se na tabela 2.1
A fim explorar melhor os aspectos da declarao, seguem-se alguns comentrios a respeito do ltimo
exemplo (programa 2)
Observe que o nome do algoritmo (teste_variaveis) no tem acento. Se declarar o algoritmo como
teste_variveis e tentar compilar o cdigo, o seguinte erro ser exibido:
Linha: 1 - teste_variveis no pode ter caracteres especiais.
Portanto, identificadores (nomes de variveis, funes e do algoritmo) no podem ter acentos ou
caracteres especiais como $, #, etc. A definio de um identificador em G-Portugol equivalente ao
das linguagens populares: uma letra (a-z ou A-Z) seguido de qualquer nmero de letras ou nme-
ros. Finalmente, underlines so permitidos. Cedilhas, portanto, tambm no formam identificadores
vlidos.
O segundo ponto, a palavra-chave variveis: ela tem acento, e isso permitido e obrigatrio.
G-Portugol 5
Captulo 3. Programando em G-Portugol
O terceiro, a definio do bloco e sua (falta de) semelhana com o Pascal. Todas os blocos em
G-Portugol tentam seguir o formato nome/fim-nome, em favor da uniformidade e em detrimento de
excees lingusticas que confundem os estudantes.
E, finalmente, o quarto ponto a ausncia de cdigo entre incio e fim. O programa no obrigado
a ter enunciados ou comandos.
variveis
bitset : matriz[10] de lgicos;
quadr : matriz[4][4] de inteiros;
fim-variveis
O tipo do vetor ou matriz dado pelo nome do tipo no plural (inteiros para tipo inteiro, literais para
tipo literal, etc). Os subscritos na declarao (delimitados por []) indicam o tamanho da matriz, e sua
dimenso informada pelo numero de subscritos. Portanto, bitset um vetor de 10 valores lgicos,
enquanto quadr uma matriz bidimensional, onde as duas dimenses tem tamanho 4.
importante observar que matrizes so 0 based, isso , iniciam no ndice 0 e seus ndices so sempre
inteiros positivos. Logo, a matriz bitset pode ser usada do ndice 0 at o ndice 9 (inclusive). Seu ndice
10 no vlido e seu uso poder acarretar em erros de execuo (runtime errors). Matrizes, assim como
variveis de tipos primitivos, so inicializadas com o valor 0 ou nulo em todas as suas posies. Quando
usadas como argumentos de funes, matrizes so passadas por valor.
O mundo divido em dois grupos: aqueles que comeam a contar a partir do 0, e aqueles
que no.
Annimo
G-Portugol 6
Captulo 3. Programando em G-Portugol
variveis
idade : inteiro;
nome : literal;
fim-variveis
incio
imprima("Digite seu nome:");
nome := leia();
A funo interna leia pode ser usada por variveis primitivas de qualquer tipo.
A funo imprima recebe um nmero de argumentos variveis, que podem ser constantes literais
(nmeros, textos entre aspas, caracteres entre aspas simples,...), variveis primitivas ou ndices de
vetores/matrizes. Os valores so concatenados e adicionados de um caractere EOL (end of line, ou
fim de linha).
J vimos que strings/literais constantes so denotados por texto entre aspas duplas ("). Tal qual em
C, um caractere entre aspas simples () um caractere constante que, tambm, permite escapes
para representar caracteres como EOL (\n).
G-Portugol 7
Captulo 3. Programando em G-Portugol
incio
se x = 2 ento
imprima("ok");
imprima("estou dentro ou fora do bloco \"se\"?");
fim
variveis
res : inteiro;
fat : inteiro;
x : inteiro;
fim-variveis
incio
imprima("Digite um nmero:");
x := leia();
fat := x;
res := 1;
G-Portugol 8
Captulo 3. Programando em G-Portugol
para x de 0 at 10 faa
//comandos...
fim-para
variveis
res : inteiro;
fat : inteiro;
x : inteiro;
fim-variveis
incio
imprima("Digite um nmero:");
fat := leia();
res := 1;
para x de fat at 1 passo -1 faa
res := res * x;
fim-para
G-Portugol 9
Captulo 3. Programando em G-Portugol
ao sair do lao, o valor dessa varivel ser 11. Em G-Portugol, a varivel ter o valor 10 ao sair do lao.
Essa diferena acontece porque a sintaxe do para induz a esse comportamento, diferente da sintaxe do
for, que tem um aspecto de mais baixo nvel.
//cdigo em C
for(x = 0; x <= 10; x++);
printf("%d", x); //imprime ``11''
//--------------
Ademais, da mesma forma que o for, possvel que a varivel de controle tenha seu valor alterado
pelos comandos aninhados. Isso permite que o lao seja encerrado prematuramente, como tambm
comum em estruturas como enquanto. A utilidade dessa tcnica est no fato de G-Portugol no incorpo-
rar mecanismos para refinar o controle de laos (como break e continue, encontrados em linguagens
populares).
3.5 Funes
Subprogramas em G-Portugol so implementados no modelo de funes, que podem ter zero ou mais
parmetros de qualquer tipo, tanto primitivos quanto complexos (vetores e matrizes). Opcionalmente, elas
podem definir valores de retorno, que deve ser de tipo primitivo. Tanto o retorno de dados como a passagem
de argumentos so feitos por valor.
Para retorno prematuro ou retorno de dados, a palavra chave retorne usada. Para funes que
retornam dados, retorne deve ser seguido de um operando, que uma expresso cujo valor deve ser
compatvel com o tipo da funo. J funes que no declaram um tipo de retorno expliticamente (equiva-
lente a funes de retorno void em C), retorne deve ser usado sem operando.
G-Portugol 10
Captulo 3. Programando em G-Portugol
variveis
x : inteiro;
fim-variveis
incio
imprima("Digite um nmero:");
x := leia();
imprima("fatorial de ",x," igual a ",fatorial(x));
fim
variveis
c: caractere;
i: inteiro;
r: real;
l: literal;
z: lgico;
mat: matriz[2] de inteiros;
fim-variveis
incio
imprima("digite um caractere");
c := leia();
imprima("Digite um nmero inteiro");
i := leia();
imprima("Digite um nmero real:");
r := leia();
imprima("Digite um texto:");
l := leia();
imprima("Digite um valor lgico (\"verdadeiro\" ou \"falso\"), um nmero ou um texto:");
z := leia();
imprima("caractere: ",c,", inteiro: ",i, ", real: ",r,", texto: ",l, ", lgico: ", z,"\n");
fim
G-Portugol 11
Captulo 4
Implementao da linguagem
G-Portugol
4.1 Introduo
Ao definir uma linguagem de programao voltada para o ensino de lgica e algoritmos, vrios aspectos
devem ser considerados. Ao contrrio de linguagens de produo, no h preocupaes como o poder
expressivo da linguagem, dicionrio em ingls, acesso a recursos de sistema, etc. A preocupao central
est em oferecer uma ferramenta que:
reflita os processos computacionais, exigindo o mnimo de conhecimento e experincia do estudante;
evidencie os processos relacionados com o desenvolvimento de softwares;
estimule a abstrao e raciocnio lgico do estudante.
4.2 A linguagem
O ponto fundamental que guia as diretrizes da linguagem G-Portugol seu propsito educacional: ela deve
expressar processos computacionais de forma que um leigo os compreenda sem enfatizar a si mesma.
Isso , a linguagem em si deve chamar o mnimo de ateno possvel, fazendo com que a compreenso
dos processos computacionais seja to natural quanto ler sua descrio informal, ou no-estruturada.
Esse objetivo encontra restries, quando se leva em considerao a natureza das linguagens artificiais
e o uso e forma popular atual da linguagem portugol, principalmente em literaturas. de interesse que
G-Portugol oferea compatibilidade com essas formas, o que pode gerar conflitos quanto a decises de
design e restringir suas caractersticas. Portanto, embora as diretrizes marquem a base do design, muitas
vezes, elas devem ser sacrificadas ou ajustadas para incorporar formas populares.
interessante ressaltar que criar uma linguagem totalmente nova, que utiliza outros paradigmas como,
por exemplo, orientao a objeto, possa ser interessantes e, talvez, mais eficientes como ferramentas de
ensino, mas G-Portugol est, no momento, comprometida com a compatibilidade.
A seguir, alguns tpicos sero comentados quanto as diretrizes por traz das formas lxicas e gramati-
cais da linguagem G-Portugol.
G-Portugol 12
Captulo 4. Implementao da linguagem G-Portugol
A deciso de incorporar palavras que respeitam a lngua portuguesa importante, visto que modificar
a linguagem de forma a se afastar de sua lngua natural (o portugus) pode evidenciar excesses as quais
forariam os usurios (estudantes e professores) a se ater mais com o estudo da linguagem do que com o
estudo da disciplina em questo. Isso , a ausncia de acentos, por exemplo, obriga o usurio a aprender
seus termos excepcionais. Alm do mais, o uso de termos como nao, chama a ateno constante do
usurio para o fato de a palavra no estar acentuada, o que costuma desviar ateno do estudo.
Consequentemente, o uso de acentos permite que a linguagem seja o mais prximo do portugus
quanto for possvel, apoiando a regra de no chamar ateno para si. Ademais, o cdigo fica mais legvel
e permite uma leitura mais agradvel.
Alm dos acentos, exigido que as palavras-chave usadas sejam completas ou por extenso, sem
permitir abreviaes (ex. proc, func, char, int, ...), o que dificulta a leitura de programas por um leigo.
H tambm decises quanto a forma verbal de comandos e funes. Em geral, na literatura, os verbos
nos algoritmos so expressos no imperativo, visto que a linguagem caracterizada como imperativa. Por
outro lado, vale notar que, mesmo em linguagens imperativas, comum ver programas que utilizam termos
em portugus usando verbos no infinitivo.
Mesmo com essa perspectiva em vista, G-Portugol se utiliza de verbos no imperativo para seus termos,
de forma a se aproximar das formas utilizadas nas literaturas sobre algoritmos.
Programas devem ser escritos para pessoas lerem e, apenas incidentalmente, para mqui-
nas executarem.
Abelson e Sussman
Deve ser configurvel naquilo que diz respeito a diferentes abordagens de ensino e estilo do pro-
fessor
Essa diretriz diz respeito a permitir que a linguagem mude em certos aspectos (ou disponibilizar meios
simples para realizar essas mudanas) de acordo com o gosto do professor, ou como modo de adapatar
a forma de portugol de uma dada literatura. Dialetos e formas da linguagem portugol variam de literatura
para literatura, e pode ser interessante permitir que a linguagem se adapte ou oferecer diferentes formas
da linguagem.
Entre os aspectos que podem ser adaptados com facilidade se encontram os termos lxicos (palavras-
chave, operadores,etc), e algumas formas de expressar estruturas, como algumas declaraes e enuncia-
dos.
Por exemplo, pode ser interessante que, para se declarar uma varavel, no se use um bloco iniciado
por variveis e terminado por fim-variveis, mas como um bloco parecido com a declarao de variveis
em Pascal, ou at em C (que sequer exige delimitao de bloco de variveis).
Isso pode ser interessante quando se quer, por exemplo, ensinar uma linguagem especfica como
Pascal, fazendo com que G-Portugol possa usar estruturas e operadores semelhantes a esta linguagem,
de forma a oferecer uma transio mais direta e que aproveita melhor os conhecimentos do estudante.
Atualmente, o programa GPT no implementa mecanismos para esse tipo de mudana, sendo nesces-
sario modificar seu cdigo fonte e recompil-lo.
G-Portugol 13
Captulo 4. Implementao da linguagem G-Portugol
declarao do algoritmo
declarao de variveis globais
bloco principal
declarao de funes
variveis
x : inteiro;
fim-variveis
Esse formato difere de linguagens como Pascal e C. Em Pascal, o bloco no tem um delimitador final
(como fim-variveis) e em C, no existe qualquer delimitador.
Delimitar o bloco permite maior consistncia com outras formas gramaticais como os blocos de co-
mando e estruturas de controle, e torna o cdigo mais claro e explicito, embora adicione construes
redundantes.
Os tipos primitivos englobam os tipos mais bsicos das linguagens populares. No momento, agregados
heterogneos como, por exemplo, estruturas/registros (struct em C) no so suportados. Para uma lista
dos tipos suportados, veja a tabela 2.1.
Estruturas de Controle
Estruturas de controle so formadas por um cabealho seguido por um bloco de comandos e terminados
por um delimitador final. Embora os delimitadores do bloco no sejam incio e fim, h um grau de se-
melhana mantido: o delimitador inicial omitido (uma vez que o cabealho entendido como delimitador
inicial) e o delimitador final o termo fim- seguido do nome da estrutura.
No cabealho das estruturas como enquanto e se, as expresses no precisam ser delimitadas por
parntesis.
G-Portugol 14
Captulo 4. Implementao da linguagem G-Portugol
Expresses
Expresses so operaes que sintetizam, ao final, um valor. Em geral constituem valores ou operaes
aritimticas com um ou mais termos que podem ser variveis, constantes ou chamadas a funes e so
usadas em atribuies, estruturas de controle e subscritos de matrizes e vetores. Enunciados (como
atribuies) no podem ser avaliados como expresses.
Constantes so valores inline, e cada tipo de dado tem uma forma de ser representada.
Inteiros: Podem ser representados em base decimal, hexadecimal, octal e binria. Representa-
es decimais so formadas, opcionalmente, por um sinal (+ ou -) seguido de um mais algaris-
mos(ex.120, +5, e -2). Representaes hexadecimais so representadas com o prefixo 0x ou
0X, seguido de algarismos entre 0 e 9 e letras entre a e f ou A e F (ex. 0xF1A5). Repre-
sentaes octais so representadas com o prefixo 0c ou 0C, seguido de algarismos entre 0 e 7
(ex. 0c61). Finalmente, representaes binrias so formadas pelo prefixo 0b ou 0B, seguido
de algarismos 0 e 1 (ex. 0b101).
Reais: so representados por, opcionalmente, um sinal (+ ou -), seguido de algarismos separados
por um . como -1.2345.
Caracteres: so representados por um nico simbolo entre aspas simples. Alguns caracteres espe-
ciais so representados com escape (\) seguido de smbolo identificador. Esses caracteres so o
LF (\n), CR (\r) e barra invertida (\\). A ausncia de smbolos entre as aspas simples indica um
caractere nulo. Internamente, caracteres so representados como nmeros inteiros, o que permite
sua compatibilidade numrica.
Literais: so representados por um conjunto de caracteres entre aspas duplas. Eles podem conter
caracteres especiais como \n e devem ser definidos em apenas uma linha de cdigo. Valores literais
so os nicos que no tem uma representao numrica, impedindo sua participao em expresses
com operadores aritmticos (soma, diviso, etc). Comparaes de igualdade para valores literais
so feitas caractere por caractere em case sensitive. Portanto, a expresso portugol = Portugol
avaliada como falsa. J comparaes de grandeza so feitos calculando o nmero de caracteres
que compem os valores literais. Ento, a expresso maria > jos avaliada como verdadeira.
Lgicos: so representados pelas palavras verdadeiro e falso. Numericamente, qualquer valor
diferente de 0 representa o valor verdadeiro e 0 representa o valor falso.
A precedncia de operadores mostrada na tabela 4.1 (da menor precedncia para a maior) e pode
ser explcicamente modificada com o uso de parntesis.
Precedncia de Operadores
Operador Nome
ou OR lgico
e AND lgico
| OR bit-a-bit
XOR bit-a-bit
& AND bit-a-bit
=, <> operadores igual e diferente
>, >=, <, <= operadores relacionais maior, maior ou igual, menor, menor ou igual
+, - operadores aritmticos soma e subtrao
*, /, % operadores aritmticos multiplicao, diviso, mdulo
+, -, , no, () operadores unrios positivo, negativo, NOT binrio, NOT lgico, parntesis
G-Portugol 15
Captulo 4. Implementao da linguagem G-Portugol
igualdade ou diferena de valores reais no so apropriadas dado a forma como esses valores so repre-
sentados internamente. Tais comparaes podem ter resultados imprevisveis, e at diferentes, ao serem
executados nos modos compilado, interpretado ou traduzido.
Existem dois casos em que ocorre uma coero implcita. O primeiro caso ocorre durante a avaliao
de uma expresso que tem operandos de tipos diferentes (mas compatveis entre si), onde no h perda de
dados e um dos termos promovido para o tipo do seu termo complementar. Por exemplo, na expresso
2 + 1.5, o termo 2 promovido para o tipo real, tendo o valor 2.0 antes que a soma seja processada.
Da mesma forma, sendo x uma varivel de tipo real, a expresso x := 5 / 2 atribuir a x o valor 2.00.
Esse comportamento no muito bvio similar ao da linguagem C, onde 5 / 2 avaliado como uma
diviso de inteiros, onde apenas o valor inteiro final relevante. Para obter o resultado real, a expresso
deve ser 5.0 / 2, para informar ao compilador que a diviso usar valores reais, produzindo a promoo
de tipos mencionada anteriormente.
O segundo caso em que ocorre uma coero implcita discutido na seo 4.3.4.
4.3.4 Atribuies
Atribuies permitem a manipulao de valores na memria. Em G-Portugol, como j foi visto, usado
o operador :=, onde o termo a esquerda ou lvalue deve ser uma varivel primitiva ou ndice de uma
matriz/vetor, e o termo a direita, uma expresso que, quando avaliada, tem seu tipo compatvel com o
lvalue.
Pode haver coero de tipos durante a atribuio, quando o resultado da expresso de um tipo dife-
rente (mas compatvel) do tipo de lvalue. possvel que dados sejam comprometidos, por exemplo, tendo
uma expresso avaliada como real sendo atribuida a uma varivel de tipo inteiro (o valor ser truncado).
Matrizes no so aceitas como lvalue, como pode ser visto no programa 9.
variveis
m1 : matriz[2] de inteiros;
m2 : matriz[2] de inteiros;
fim-variveis
incio
m1 := m2; //erro
imprima(m1); //erro
fim
4.4 Funes
Funes so os subprogramas de G-Portugol. So definidas aps o bloco principal e podem receber
argumentos e retornar valores. Em tempo de execuo, as funes criam um novo escopo sobreposto
ao escopo principal. Isso permite recursos como recurso e possibilita que variveis locais (no escopo
da funo) tenham o mesmo nome que variveis globais, onde essas ltimas ficam escondidas, isso ,
incapazes de serem acessadas enquanto o escopo durar. Ressalta-se que no h suporte para funes
aninhadas, isso , funes declaradas dentro de funes.
O retorno de dados feito por meio da instruo retorne e o valor de retorno (se houver) deve ser
compatvel com o tipo da funo. Esse tipo no pode ser um tipo agregado como matrizes e vetores.
Tanto a passagem de argumentos quanto o retorno feito por valor, isso , a copia do valor feita, ao
invez de a copia de endereo ou passagem por referncia.
G-Portugol 16
Captulo 4. Implementao da linguagem G-Portugol
As variveis locais de uma funo so formadas por seus parmetros e pelas variveis declaradas em
seu escopo. A declarao de variveis locais feita entre o cabealho da funo e a palavra-chave incio,
portanto, no uniforme em relao a declarao global, onde se usa as palavras-chave variveis e
fim-variveis.
A declarao dos parmetros da funo tambm no segue estritamente o formato de declarao de
variveis. O programa 10 ilustra a declarao de uma funo.
incio
imprima(soma(2,2));
fim
G-Portugol 17
Captulo 4. Implementao da linguagem G-Portugol
parmetro de um dado tipo (inteiro, real, etc), que alimentado com o valor lido. Essa forma exige que a
passagem seja feita por referncia. A outra forma, a implementada em G-Portugol, onde a funo no
recebe parmetros e retorna o valor lido.
As duas formas exigem comportamentos excepcionais, visto que G-Portugol no tem suporte para
sobrecarga de funes (por parmetro ou retorno) ou passagem de parmetros por referncia.
G-Portugol 18
Captulo 5
O programa GPT
5.1 Intruduo
GPT a ferramenta principal da linguagem G-Portugol. Entre suas funes principais esto:
Compilar algoritmos;
Executar algoritmos.
Na verso atual possvel compilar algoritmos para sistemas Windows e Unices que suportam o for-
mato ELF e o assembler NASM. Tambm, h suporte apenas para a traduo de algoritmos para a lingua-
gem C. O resultado um cdigo em C 100% equivalente ao algoritmo.
possvel, tambm, executar algoritmos sem gerar cdigo ou arquivos extra, de forma interpretada.
Tambm, com a interpretao, possvel depurar passo a passo o algortmo com o uso de uma ferramenta
auxiliar (um cliente de depurao).
Vale ressaltar que, qualquer que seja o modo de uso do algoritmo (compilado, interpretado ou tra-
duzido), se espera que eles tenham sempre comportamentos equivalentes. Isso , o resultado de uma
execuo interpretada deve ser o mesmo se a execuo fosse feita por meio de um binrio compilado.
Opes:
-v mostra verso do programa
-h mostra esse texto
-o <arquivo> compila e salva executvel como <arquivo>
-t <arquivo> salva o cdigo em linguagem C como <arquivo>
-s <arquivo> salva o cdigo em linguagem assembly como <arquivo>
-i interpreta
G-Portugol 19
Captulo 5. O programa GPT
o <arquivo>: Ao compilar um algoritmo, salva o executvel com o nome de <arquivo>. Se essa opo
for omitida na compilao, o nome do algoritmo ser usado para criar o arquivo executvel.
t <arquivo>: Traduz o algoritmo para C, salva o cdigo fonte com o nome de <arquivo>;
s <arquivo>: Compila o algoritmo mas no cria cdigo executvel. Salva o cdigo em assembly com
o nome de <arquivo>;
i: Executa o algoritmo diretamente, sem compilar ou criar arquivos. Opo conhecida como inter-
pretao ou scripting.
d: Exibe mais informaes no relatrio de erros, como dicas de como proceder para solucionar errors
de sintxe.
A ltima opo (arquivos) uma lista de arquivos contendo o cdigo fonte em G-Portugol, embora
seja mais comum utilizar um arquivo apenas para cada algoritmo.
G-Portugol 20
Captulo . O programa GPT
cdigos extras so adicionados no arquivo resultante, para, por exemplo, permitir passagem de matrizes
por valor, inicializao automtica de variveis e outras abstraes.
A traduo para C limitada no que diz respeito a nomes e identificadores. possvel, por exemplo,
declarar uma varivel em G-Portugol com o nome de printf. Ao traduzir para C e tentar compilar o cdigo
resultante, o compilador pode emitir avisos e erros, visto que printf uma funo da biblioteca padro,
usada no cdigo C resultante. Da mesma forma, identificadores com underlines antes ou depois em
seus nomes (como __leia_texto) devem ser evitados, pois muitos identificadores internos utilizam essas
convenes de nomeao, e seu uso pode acarretar em conflitos durante a traduo.
Depurao interativa
A depurao interativa feita em modo interpretao, portanto no gera cdigo binrio, executando o
algoritmo diretamente. Para depurar interativamente um algoritmo nescessrio um programa extra: o
client debugger. Atualmente, o programa GPTEditor suporta a depurao interativa.
Entre os recursos disponveis, pode-se citar a execuo passo a passo em 3 modos (comumente co-
nhecidas como step into, step over e step out), inspeo de variveis locais/globais e pontos de parada
(breakpoints).
A depurao ocorre tendo o programa GPT se comunicando via socket com o cliente (ex: GPTEditor),
iniciando transmisso de dados entre esses dois pontos. As informaes enviadas pelo GPT (variveis,
breakpoints, etc) usam o formato baseado em XML, enquanto o cliente envia comandos simples (o que
evita que o programa GPT nescessite de um XML parser).
Por exemplo, a pilha de funes pode ser representada da seguinte forma:
<stackinfo>
<entry id="0" function="@global" line="10"/>
<entry id="1" function="funcTeste" line="18"/>
</stackinfo>
A primeira forma explicada na sesso 5.2. A segunda forma pretende facilitar a utilizao de funes
que devem estar disponveis por padro a cada execuo/compilao dos algoritmos. Pode-se definir
a varivel de ambiente GPT_INCLUDE contendo vrios caminhos de arquivos separados por :. Em
sistemas Unix, por exemplo, pode-se criar a essa varivel da seguinte forma (utilizando Bash):
$ export GPT_INCLUDE="/usr/local/lib/gpt/base.gpt:/usr/local/lib/gpt/util.gpt"
G-Portugol 21
Captulo . O programa GPT
G-Portugol 22
Apndice A
T_DEC_LIT : [0-9]+
A.2 Gramtica
A seguir apresentado a gramtica da linguagem G-Portugol.
G-Portugol 23
Captulo A. Gramtica da linguagem G-Portugol
Palavras-chave de G-Portugol
fim-variveis algoritmo variveis inteiro real
caractere literal lgico incio verdadeiro
falso fim ou e no
se seno ento fim-se enquanto
faa fim-enquanto para de at
fim-para matriz inteiros reais caracteres
literais lgicos funo retorne passo
algoritmo
: declaracao_algoritmo (var_decl_block)? stm_block (func_decls)* EOF
;
declaracao_algoritmo
: "algoritmo" T_IDENTIFICADOR ";"
;
var_decl_block
: "variveis" (var_decl ";")+ "fim-variveis"
;
var_decl
: T_IDENTIFICADOR ("," T_IDENTIFICADOR)* ":" (tp_primitivo | tp_matriz)
;
tp_primitivo
: "inteiro"
| "real"
| "caractere"
| "literal"
| "lgico"
;
tp_matriz
: "matriz" ("[" T_INT_LIT "]")+ "de" tp_prim_pl
;
tp_prim_pl
: "inteiros"
| "reais"
| "caracteres"
| "literais"
| "lgicos"
;
stm_block
: "incio" (stm_list)* "fim"
;
stm_list
: stm_attr
G-Portugol 24
Captulo A. Gramtica da linguagem G-Portugol
| fcall ";"
| stm_ret
| stm_se
| stm_enquanto
| stm_para
;
stm_ret
: "retorne" expr? ";"
;
lvalue
: T_IDENTIFICADOR ("[" expr "]")*
;
stm_attr
: lvalue ":=" expr ";"
;
stm_se
: "se" expr "ento" stm_list ("seno" stm_list)? "fim-se"
;
stm_enquanto
: "enquanto" expr "faa" stm_list "fim-enquanto"
;
stm_para
: "para" lvalue "de" expr "at" expr passo? "faa" stm_list "fim-para"
;
passo
: "passo" ("+"|"-")? T_INT_LIT
;
expr
: expr ("ou"|"||") expr
| expr ("e"|"&&") expr
| expr "|" expr
| expr "^" expr
| expr "&" expr
| expr ("="|"<>") expr
| expr (">"|">="|"<"|"<=") expr
| expr ("+" | "-") expr
| expr ("/"|"*"|"%") expr
| ("+"|"-"|"~"|"no")? termo
;
termo
: fcall
| lvalue
| literal
| "(" expr ")"
;
G-Portugol 25
Captulo A. Gramtica da linguagem G-Portugol
fcall
: T_IDENTIFICADOR "(" fargs? ")"
;
fargs
: expr ("," expr)*
;
literal
: T_STRING_LIT
| T_INT_LIT
| T_REAL_LIT
| T_CARAC_LIT
| T_KW_VERDADEIRO
| T_KW_FALSO
;
func_decls
: "funo" T_IDENTIFICADOR "(" fparams? ")" (":" tb_primitivo)?
fvar_decl
stm_block
;
fvar_decl
: (var_decl ";")*
;
fparams
: fparam ("," fparam)*
;
fparam
: T_IDENTIFICADOR ":" (tp_primitivo | tp_matriz)
;
G-Portugol 26