You are on page 1of 30

G-Portugol

Manual da verso v1.0

Thiago Silva
thiago.silva@kdemail.net

8 de abril de 2006

Sumrio
1 Introduo

2 Caractersticas Gerais
2.1 Tipos de dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2 Estruturas de controle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.3 Subprogramas (funes) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2
2
2
3

3 Programando em G-Portugol
3.1 Ol Mundo . . . . . . . . . . . . . . .
3.2 Variveis . . . . . . . . . . . . . . . .
3.2.1 Variveis primitivas . . . . . . .
3.2.2 Vetores e matrizes (conjuntos)
3.3 Estruturas condicionais . . . . . . . .
3.4 Estruturas de repetio . . . . . . . .
3.4.1 A estrutura enquanto . . . . .
3.4.2 A estrutura para . . . . . . .
3.5 Funes . . . . . . . . . . . . . . . . .
3.5.1 Funes internas . . . . . . . .

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

4
.
4
.
5
.
5
.
6
.
6
.
8
.
8
.
8
. 10
. 10

4 Implementao da linguagem G-Portugol


4.1 Introduo . . . . . . . . . . . . . . . . . . . .
4.2 A linguagem . . . . . . . . . . . . . . . . . .
4.2.1 Diretrizes para o design da linguagem
4.3 Formato Estrutural . . . . . . . . . . . . . . .
4.3.1 Declarao do algoritmo . . . . . . . .
4.3.2 Declarao de variveis globais . . .
4.3.3 Bloco Principal . . . . . . . . . . . . .
4.3.4 Atribuies . . . . . . . . . . . . . . .
4.4 Funes . . . . . . . . . . . . . . . . . . . . .
4.5 Funes internas . . . . . . . . . . . . . . . .
4.5.1 A funo imprima . . . . . . . . . . .
4.5.2 A funo leia . . . . . . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

12
12
12
12
14
14
14
14
16
16
17
17
17

5 O programa GPT
5.1 Intruduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.2 Opes gerais . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.3 Tratamento de erros . . . . . . . . . . . . . . . . . . . . . . . .
5.4 Execuo de programas . . . . . . . . . . . . . . . . . . . . . .
5.4.1 Compilao e gerao de cdigo executvel . . . . . .
5.4.2 Traduo para a linguagem C . . . . . . . . . . . . . . .
5.4.3 Interpretao de cdigo . . . . . . . . . . . . . . . . . .
5.4.4 Processando algoritmos divididos em multiplos arquivos

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

19
19
19
20
20
20
20
21
21

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

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 um dialeto da linguagem/pseudo-cdigo portugol (ou portugs estruturado), que muito
usada para descrever algoritmos em portugus, de forma livre e espontnea. Em geral, livros dedicados
ao ensino de algoritmos, lgica e estruturas de dados utilizam alguma forma dessa linguagem.
A proposta de G-Portugol disponibilizar uma implementao da linguagem portugol, fornecendo ferramentas que ofeream recursos de edio, compilao, execuo e depurao de programas escritos
nessa linguagem, de forma a favorecer estudantes que do os primeiros passos no aprendizado de desenvolvimento de softwares, bem como professores que ensinam disciplinas relacionadas a computao.
Portanto, seu foco primariamente didtico.
Se encontram disponveis atualmente um compilador, tradutor e interpretador para a linguagem (GPT)
e um ambiente visual simples (GPTEditor) que permite a edio, execuo e depurao de programas
escritos em G-Portugol.
A seguir apresentado os assuntos abordados nos captulos seguintes:
Captulo 2: pretende discutir as caractersticas gerais da linguagem.
Captulo 3: aborda a programao em G-Portugol, suas estruturas e recursos, utilizando exemplos
ilustrativos e comparando com linguagens populares. Embora o captulo trate da programao, ele
no tem como objetivo explicar programao em si ou a teoria/historia por traz das estruturas abordadas.
Captulo 4: trata da implementao da linguagem. Discute as decises de design e recursos oferecidos por G-Portugol.
Captulo 5: descreve o programa GPT.
No apndice deste livro pode ser encontrado a gramtica da linguagem G-Portugol.

G-Portugol

Captulo 2

Caractersticas Gerais
A linguagem em si no difere fundamentalmente ou apresenta novidades em relao ao uso popular de
portugol. Semelhante linguagens como Pascal e C, uma linguagem imperativa, com comandos de
controle de fluxo, manipulao de dados e recursos de entrada e sada bsicos. A linguagem em case
sensitive, o que significa que, por exemplo, uma funo chamada leia diferente de uma funo chamada
Leia.

2.1

Tipos de dados

Tipos primitivos como inteiro e literal so suportados. Literais so tipos integrais, e no, tipos construdos
pelo usurio. A tabela 2.1 apresenta os tipos com respectivos exemplos de dados:
Tipos primitivos
Tipo
Exemplos
inteiro
19
real
2.5
caractere a
literal
uma frase
lgico
verdadeiro
Tabela 2.1: Tipos de dados primitivos
Com esses tipos, pode-se criar conjuntos como vetores ou matrizes n dimensionais. Tipos mais
complexos no so suportados.

2.2

Estruturas de controle

O conjunto de estruturas de controle so os mais primitivos. Uma estrutura condicional (se/seno) e duas
estruturas de repetio (enquanto/para) so suportadas. Embora a estrutura para seja uma especializao de um lao simples como o enquanto, ela foi implementada, visto que uma variedade de livros e
muitos professores os discutem.

G-Portugol

Captulo 2. Caractersticas Gerais

Estruturas de controle
Estrutura
Tipo
se/ento/seno/ condicional
enquanto
repetio
para
repetio
Tabela 2.2: Estruturas de repetio

2.3

Subprogramas (funes)

Subprogramas so como funes em C. Podem receber qualquer nmero de parmetros, sejam tipos primitivos ou vetores/matrizes, e podem retornar apenas valores primitivos. Entretanto, no permitido declarar
funes aninhadas ou funes com parmetros variveis. Vale ressaltar que passagem de parmetros
sempre feita por valor.

G-Portugol

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:
Programa 1 Ol Mundo em G-Portugol.
/*
Nosso primeiro programa
*/

algoritmo olamundo;
incio
imprima("Ol mundo!");
fim

Aps salvar o arquivo, digite o seguinte na linha de comando:


No linux:

$ gpt -o olamundo olamundo.gpt


No Windows:

\> gpt -o olamundo.exe olamundo.gpt


Esse comando compila o algoritmo e salva o arquivo binrio resultante como olamundo (ou olamundo.exe) no diretrio atual. Se a opo -o <arquivo> no for informada, o GPT criar o executvel
usando o nome do algoritmo. Aps executar o programa criado, exibido o texto Ola mundo! na tela.
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

Captulo 3. Programando em G-Portugol

imprima("Isso uma "


"Concatenao"); //erro!
Outro detalhe a pontuao. Da mesma forma que em C, o ; utilizado como finalizador de enunciados.

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:
Programa 2 Declarao de variveis globais.
algoritmo teste_variaveis;

variveis
x
: inteiro;
nome : literal;
fim-variveis
incio
fim

3.2.1

Variveis primitivas

Variveis primitivas so declaradas seguindo o seguinte modelo:

<identificador> [, identificador]* : <tipo>;


Isso , um ou mais identificadores separados por virgula, seguido de um :, seguido de um tipo, seguido, finalmente, de ;. Como pode-se notar, parecido com Pascal. Assim que um programa executado, 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 nmeros. 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

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.
Para maiores detalhes, veja o captulo 4, sobre a implementao da linguagem.

3.2.2

Vetores e matrizes (conjuntos)

Vetores e matrizes n dimensionais de tipos primitivos so suportados. Um exemplo de declarao de


uma matriz:

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

3.3

Estruturas condicionais

Por enquanto, apenas a estrutura se/ento/seno suportada. Essa e as demais estruturas utilizam
expresses, que so avaliadas para que uma deciso seja tomada (repetir execuo, selecionar bloco
de instrues, etc). Qualquer expresso pode ser avaliada como expresso lgica. Expresses numricas
de valor 0 so avaliadas como falso. Demais valores numricos so avaliados como verdadeiro. Valores
literais nulos, da mesma forma, so avaliados como falso, e demais textos, como verdadeiro. Para maiores
detalhes sobre expresses, veja a seo 4.3.3.

enquanto
enquanto
enquanto
enquanto
enquanto
enquanto
enquanto
enquanto

x faa
"nome" = "nome" faa
verdadeiro faa
3+5 faa
"nome" faa
0 faa
"" faa
'' faa

//depende do valor de x
//avalia como verdadeiro
//avalia como verdadeiro
//avalia 8 como verdadeiro
//avalia como verdadeiro
//avalia 0 como falso
//avalia como falso
//avalia como falso

O programa 3 ilustra um algoritmo simples que verifica se o usurio maior de idade.


Alguns pontos a serem considerados:
G-Portugol

Captulo 3. Programando em G-Portugol

Programa 3 Exemplo de programa que utiliza estrutura condicional.


algoritmo idade;

variveis
idade : inteiro;
nome : literal;
fim-variveis
incio
imprima("Digite seu nome:");
nome := leia();
imprima(nome, ", digite sua idade:");
idade := leia();
se idade >= 18 ento
se idade < 60 ento
imprima("adulto!");
seno
imprima("ancio", '!');
fim-se
seno
imprima("menor", "!");
fim-se
fim

O nome do algoritmo idade, assim como o nome de uma varivel. No h conflitos.


O operador de atribuio o pascal-like :=.
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).
Assim como a palavra-chave variveis, ento e seno devem ser acentuadas.
Parntesis ao redor da expresso da estrutura se/ento so opcionais.
Como em variveis/fim-variveis, blocos se tem seus respectivos e obrigatrios fim-se. No h a
opo de ignorar a definio do bloco quando apenas um enunciado usado, como na linguagem C
onde o uso de {} opcional. Tambm, no h imposies sobre a indentao. O programa 4 ilustra
esse assunto.

G-Portugol

Captulo 3. Programando em G-Portugol

Programa 4 Uso incorreto de estrutura condicional.


//cdigo invlido: faltando fim-se
algoritmo se_invalido;

incio
se x = 2 ento
imprima("ok");
imprima("estou dentro ou fora do bloco \"se\"?");
fim

3.4
3.4.1

Estruturas de repetio
A estrutura enquanto

A estrutura enquanto a mais bsica e comum das estruturas de repetio. Seu funcionamento o
mesmo que em outras linguagens populares, onde um conjunto de instrues executado repetidamente
enquanto o valor lgico de uma dada expresso for avaliado como verdadeiro.
Programa 5 Exemplo de programa que utiliza a estrutura enquanto.
algoritmo fatorial;

variveis
res : inteiro;
fat : inteiro;
x : inteiro;
fim-variveis
incio
imprima("Digite um nmero:");
x := leia();
fat := x;
res := 1;
enquanto x <> 0 faa
res := res * x;
x
:= x - 1;
fim-enquanto
imprima("fatorial de ",fat," igual a ",res);
fim

Assim como na estrutura se/ento, parnteses em volta da expresso so opcionais e as expresses


seguem as mesmas regras.

3.4.2

A estrutura para

A estrutura para uma especializao da estrutura enquanto, e costuma ser ensinada em cursos de
programao. Sua sintxe semelhante ao que se v em literatura sobre algoritmos e estruturas de dados,
entretanto, uma sintaxe diferente de linguagens populares como C e Java.
G-Portugol

Captulo 3. Programando em G-Portugol

A estrutura para tem a seguinte forma:

para <varivel> de <expresso> at <expresso> [passo <inteiro>] faa


[lista de comandos]
fim-para
Onde:
varivel deve ser uma varivel numrica;
expresso deve ser uma expresso que tem seu valor avaliado como numrico;
passo, se existir, deve ser seguido por um inteiro constante.
As expresses de/at controlam os valores que a varivel numrica ter no incio e no fim do lao,
respectivamente. Tanto o controle da frequncia, quanto a deciso de incrementar ou decrementar a
varivel de controle feita pelo termo opcional passo, e seu valor padro 1. Por exemplo, para iterar o
valor de uma varivel numrica x de 0 at 10, escreve-se:

para x de 0 at 10 faa
//comandos...
fim-para
Da mesma forma, para uma iterao decrescente, de 2 em 2, escreve-se:

para x de 10 at 0 passo -2 faa


//comandos...
fim-para

Programa 6 Exemplo de programa que utiliza a estrutura para.


algoritmo fatorial;

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
imprima("fatorial de ",fat," igual a ",res);
fim

Em comparao com a estrutura for de linguagens com sintaxe baseadas em C, h diferenas no s


de sintaxe, mas de implementao. Um for que itera sobre uma varivel numrica de 0 at (incluindo) 10,
G-Portugol

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''
//-------------//cdigo equivalente em G-Portugol
para x de 0 at 10 faa
fim-para
imprima(x); //imprime ``10''
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 incorporar 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 (equivalente a funes de retorno void em C), retorne deve ser usado sem operando.

3.5.1

Funes internas

Como j foi visto em exemplos anteriores, G-Portugol oferece duas funes internas: leia e imprima,
que permitem uso bsico de entrada e sada, respectivamente.
A funo leia no recebe argumentos e retorna o valor lido da entrada padro (STDIN), o que significa, geralmente, ler os dados que o usurio digitar no teclado, seguido do caractere nova linha (em geral,
associado a tecla Enter no teclado). O tipo de dado retornado por leia implicitamente convertido para
o tipo primitivo exigido no contexto em que ela usada.
A funo imprima recebe um nmero varivel de argumentos de qualquer tipo primitivo, sendo que
pelo menos um argumento deve ser passado. Os valores passados como argumentos so convertidos
para texto, concatenados na ordem definida e enviados para STDOUT (em geral, associado ao display
ou monitor). No h retorno de valor para esta funo.

G-Portugol

10

Captulo 3. Programando em G-Portugol

Programa 7 Exemplo de algoritmo que utiliza funes.


algoritmo fatorial_recursivo;

variveis
x : inteiro;
fim-variveis
incio
imprima("Digite um nmero:");
x := leia();
imprima("fatorial de ",x," igual a ",fatorial(x));
fim
funo fatorial(z:inteiro) : inteiro
incio
se z = 1 ento
retorne 1;
seno
retorne z * fatorial(z-1);
fim-se
fim

Programa 8 Exemplo de usos das funes internas leia e imprima.


algoritmo io;

variveis
c: caractere;
i: inteiro;
r: real;
l: literal;
z: lgico;
mat: matriz[2] de inteiros;
fim-variveis
incio
imprima("digite
c := leia();
imprima("Digite
i := leia();
imprima("Digite
r := leia();
imprima("Digite
l := leia();
imprima("Digite
z := leia();

um caractere");
um nmero inteiro");
um nmero real:");
um texto:");
um valor lgico (\"verdadeiro\" ou \"falso\"), um nmero ou um texto:");

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 gramaticais da linguagem G-Portugol.

4.2.1

Diretrizes para o design da linguagem

A linguagem deve ser totalmente em portugus e deve respeitar acentuaes


Linguagens de programao, em geral, no se utilizam de caracteres especiais (ex. caracteres acentuados,
cedilhas, e outros que no pertencem ao alfabeto ingls) para definio de seu dicionrio, visto que so
baseadas na lngua inglesa. Portanto, letras acentuadas no so consideradas.
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 mquinas executarem.
Abelson e Sussman
A linguagem deve ser simples, uniforme e coerente
Essa diretriz diz respeito a evitar excesses entre as formas gramaticais e comportamentos semnticos na
medida do possvel. Isso significa no s que as estruturas e comandos devem ser simples, claros e bvios,
como tambm, sua forma e comportamento devem ter um princpio em comum, evidenciando um formato
uniforme. Naturalmente, a linguagem portugol j detm uma parcela relevante de caractersticas que se
acomodam nessas diretrizes, no entanto, alguns detalhes ainda merecem ateno, como a representao
de blocos estruturais.
A simplicidade implica em evitar construes e recursos que desviam a ateno do propsito original
para detalhes da linguagem. Isso , apenas recursos essenciais devem fazer parte de seu ncleo. Portanto, em um primeiro momento, no interessante equipar a linguagem com recursos como alocao
dinmica de memria, controle de threads, etc.
Deve ser configurvel naquilo que diz respeito a diferentes abordagens de ensino e estilo do professor
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 (palavraschave, operadores,etc), e algumas formas de expressar estruturas, como algumas declaraes e enunciados.
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 nescessario modificar seu cdigo fonte e recompil-lo.
G-Portugol

13

Captulo 4. Implementao da linguagem G-Portugol

4.3

Formato Estrutural

Um programa escrito em G-Portugol tem o seguinte formato:


declarao do algoritmo
declarao de variveis globais
bloco principal
declarao de funes
A seguir, alguns pontos sero discutidos a respeito do formato da linguagem.

4.3.1

Declarao do algoritmo

A declarao do algoritmo no influencia o programa ou sua execuo, visto que apenas uma sesso
informativa no cdigo que, embora no seja um comentrio, tem o mesmo efeito prtico. A adoo dessa
declarao pode ser discutida, e foi escolhida por ser bastante utilizada em literaturas.

4.3.2

Declarao de variveis globais

Como visto no captulo 2, essa declarao opcional, e seu formato pode ser visto no exemplo a seguir:

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 comando 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.

4.3.3

Bloco Principal

As linguagens de programao devem, de alguma forma, oferecer um entry point (ponto de entrada), de
onde se inicia a execuo do programa. O ponto de entrada pode ser uma funo ou um bloco annimo.
Na literatura, em geral, o bloco principal delimitado pelos termos incioe fim e G-Portugol segue essa
conveno. Essa deciso mantm um nvel satisfatrio de coerncia com o bloco de variveis globais e
estruturas de controle, embora no sejam intimamente relacionados.
Vale ressaltar que no se faz imposio sobre a identao do cdigo. Esse recurso pode ser vantajoso
no ensino, promovendo a clareza de cdigo, portanto, sua implementao pode ser discutida para verses
futuras.
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 semelhana 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. Representaes decimais so formadas, opcionalmente, por um sinal (+ ou -) seguido de um mais algarismos(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). Representaes 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 especiais 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.

Operador
ou
e
|

&
=, <>
>, >=, <, <=
+, *, /, %
+, -, , no, ()

Precedncia de Operadores
Nome
OR lgico
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
operadores unrios positivo, negativo, NOT binrio, NOT lgico, parntesis
Tabela 4.1: Precedncia de Operadores

Em G-Portugol, no h coero ou casting de tipos expliticamente. Todos os tipos numricos (inteiro, real, lgico e caractere) so compativeis entre si. importante ressaltar que expresses envolvendo
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 representados 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 diferente (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.
Programa 9 Uso incorreto de matrizes.
algoritmo atribuicao_de_matrizes;

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.
Programa 10 Exemplo de usos de funes.
algoritmo exemplo_funcao;

incio
imprima(soma(2,2));
fim
funo soma(x: inteiro, y: inteiro) : inteiro
res : inteiro;
incio
res := x + y;
retorne res;
fim

4.5

Funes internas

G-Portugol oferece duas funes internas para manipulao bsica de entrada e sada. Ambas as funes
tem comportamentos excepcionais quando comparadas com as funes de usurio. Essas funes so
discutidas na sesso a seguir.

4.5.1

A funo imprima

A funo imprima tem como objetivo imprimir texto no dispositivo de sada. Ela recebe um nmero varivel
de argumentos (pelo menos um), onde cada argumento deve ser um valor primitivo, e os imprime em
sequencia. Ao final, impresso um caractere de nova linha (LF) e a funo retorna.
Essa funo se comporta de forma excepcional visto que no possvel declarar funes em GPortugol que recebem um nmero varivel de argumentos.

4.5.2

A funo leia

A funo leia espera por uma entrada do teclado seguida do caractere LF (em geral, associado a tecla
Enter) e retorna o valor lido. Esse valor convertido implicitamente para o tipo do lvalue. A tabela 4.2
apresenta converses implcitas processadas pela funo leia para o enunciado de exemplo x := leia().
Nota: nmeros reais so arredondados, se nescessrio, e exibidos no formato .xx (com duas casas
decimais). Portanto, o nmero 250.0 ou 250 seria impresso como 250.00 e 1.449 seria impresso
como 1.45. Se o parmetro for uma varivel, seu valor no ser modificado.
Essa funo se comporta de forma excepcional visto que seu tipo de retorno no absoluto (overloaded, depende do tipo de lvalue) e, no momento, restrita expresses isentas de operadores. Isso , no
permitido aplic-la como um termo em uma expresso com multiplos operandos (ex. x := y + leia()), embora seja possvel utiliz-la em subscritos de vetores e matrizes, assim como em expresses de estruturas
de controle.
Em princpio, pode-se levar em conta duas formas de implementar uma funo de leitura em alto nvel.
A primeira, e mais simples o uso de funes sobrecarregadas, que no retornam valor e recebem um
G-Portugol

17

Captulo 4. Implementao da linguagem G-Portugol

Converses da funo leia


Tipo do LValue x Texto lido
Valor final de x
inteiro
123
123
inteiro
123 456
123
inteiro
abc
0
inteiro
123s
123
lgico
falso
falso
lgico
0
falso
lgico
falso 12wtc verdadeiro
lgico
0 umdois3
verdadeiro
Tabela 4.2: Converses implcitas da funo leia

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;
Traduzir algortimos para outras linguagens;
Executar algoritmos.
Na verso atual possvel compilar algoritmos para sistemas Windows e Unices que suportam o formato ELF e o assembler NASM. Tambm, h suporte apenas para a traduo de algoritmos para a linguagem 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 traduzido), 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.

5.2

Opes gerais

Ao executar o programa gpt com o argumento -h, mostrado:

Modo de uso: gpt [opes] arquivos


Opes:
-v
-h
-o <arquivo>
-t <arquivo>
-s <arquivo>
-i
-d

mostra verso do programa


mostra esse texto
compila e salva executvel como <arquivo>
salva o cdigo em linguagem C como <arquivo>
salva o cdigo em linguagem assembly como <arquivo>
interpreta
exibe dicas no relatrio de erros

Maiores informaes no manual.


As opes so comentadas a seguir.

G-Portugol

19

Captulo 5. O programa GPT

v: Exibe a verso do programa gpt, assim como informaes de copyright;


h: exibe todas as opes suportadas pelo 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 interpretao 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.

5.3

Tratamento de erros

Em geral, as ferramentas de diversas linguagens de programao oferecem o mnimo de informaes a


cerca de erros de compilao, as vezes, tendo uma forma criptica dificultando seu entendimento e posterior correo. Comum, tambm a possibilide de que determinados erros sejam reportados em localizaes
distantes de onde o erro efetivamente se encontra no cdigo fonte. Ademais, importante notar que
nessas linguagens, os erros so reportados em ingls.
O tratamento de erros um aspecto importante do programa GPT. A reportagem de erros deve ser o
mais claro possvel e ter um formato uniforme, informando o local exato onde o erro foi localizado. Deve,
tambm, fornecer dicas de como proceder para corrigir o erro, em alguns casos.
No momento, o analisador do GPT percorre o cdigo fonte a procura de erros e, mesmo que encontre,
continua a anlise a procura de mais erros. Uma outra abordagem, seria interromper a anlise assim que
um erro fosse encontrado.

5.4
5.4.1

Execuo de programas
Compilao e gerao de cdigo executvel

O programa GPT capaz de gerar cdigo executvel para arquiteturas compatveis com x86 e em dois
formatos: ELF (Executable and linking format) e PE (Portable Executable). Sistemas Unix, em geral,
suportam o formato ELF, e o formato PE conhecido nos sistemas Microsoft Windows. Aps o processo
de anlise, o compilador gera cdigo em assembly para, ento, usar o NASM (Netwide Assembler) como
backend para montar e criar um executvel vlido. Consequentemente, no existe etapa de linkagem. A
fase de otimizao de cdigo tambm no foi implementada.
Para usar esse recurso, nescessrio que o NASM esteja instalado no sistema. Ele pode ser encontrado em http://www.sf.net/projects/nasm.

5.4.2

Traduo para a linguagem C

possvel usar o GPT para traduzir algoritmos escritos em G-Portugol para linguagem C. O cdigo resultante, entretanto, no criado com o intuito de ser facilmente lido, visto que a traduo no direta. Isso ,
o comportamento esperado pelo algoritmo deve refletir o comportamento que o cdigo em C. Sendo assim,

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.

5.4.3

Interpretao de cdigo

O programa GPT permite que o algoritmo seja executado sem gerar cdigo binrio. Esse modo conhecido
como interpretao e linguagens como Perl, PHP e Ruby utilizam esta tcnica.
Esse modo permite depurar algoritmos passo a passo (por meio de um client debugger como o GPTEditor) e inspecionar variveis e a pilha de funes enquanto o algoritmo est em execuo.
A unica diferena na execuo de algoritmos em modo interpretado em relao a outros modos que
as matrizes/vetores tem seus subscritos checados (bound checking). Isso , erros de execuo so
emitidos se um ndice no existir em uma matriz/vetor.
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 conhecidas 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>

5.4.4

Processando algoritmos divididos em multiplos arquivos

A partir da verso 1.0, o GPT suporta processar algoritmos divididos em multiplos arquivos. Esse recurso
possvel utilizando duas formas:
Passando os arquivos como opes na linha de comando;
Utilizando a varivel de ambiente GPT_INCLUDE.
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

Onde base.gpt e util.gpt so arquivos contendo funes escritas em G-Portugol.


Os arquivos passados pela linha de comando e/ou que se encontram na varivel GPT_INCLUDE so
concatenados e processados como se o algoritmo estivesse em apenas um arquivo. Portanto, arquivos
extras no devem ter declarao de algoritmo, bloco de variveis globais ou bloco principal.

G-Portugol

22

Apndice A

Gramtica da linguagem G-Portugol


A.1

Termos lxicos

A seguir apresentado as convenes lxicas usadas em G-Portugol.

Regras para identificar literais numricos


T_INT_LIT : T_OCTAL_LIT | T_HEX_LIT | T_BIN_LIT | T_DEC_LIT
T_DEC_LIT : [0-9]+
T_OCTAL_LIT : '0' ('c'|'C') [0-8]+
T_HEX_LIT : '0' ('x'|'X') [0-9a-fA-F]+
T_BIN_LIT : '0' ('b'|'B') [01]+
T_REAL_LIT : T_DEC_LIT+ '.' T_DEC_LIT+
Regras para identificar caracteres e cadeias de caracteres
T_CARAC_LIT : ''' ( ~('''|'\') |'\' . )? '''
T_STRING_LIT : '"' ( ~( '"' | '\' | CR | LF ) | '\' . )* '"'
Regras para identificar comentrios
SL_COMMENT

: "//" [^LF]* ('\n')?

ML_COMMENT

: "/*" ( ~('*') | '*' ~'/' )* "*/"

Regra para identificar nomes de variveis, funes, etc.


T_IDENTIFICADOR : [a-zA-Z_] [a-zA-Z0-9_]*
A tabela A.1 contm as palavras-chave padro da linguagem G-Portugol.

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
algoritmo
variveis inteiro
literal
lgico
incio
fim
ou
e
seno
ento
fim-se
fim-enquanto para
de
matriz
inteiros
reais
lgicos
funo
retorne

fim-variveis
caractere
falso
se
faa
fim-para
literais

real
verdadeiro
no
enquanto
at
caracteres
passo

Tabela A.1: Palavras-chave de G-Portugol

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

You might also like