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) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 2 2 2 3

4 . 4 . 5 . 5 . 6 . 6 . 8 . 8 . 8 . 10 . 10 . . . . . . . . . . . . . . . . . . . . 12 12 12 12 14 14 14 14 16 16 17 17 17 19 19 19 20 20 20 20 21 21

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

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

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 uxo, manipulao de dados e recursos de entrada e sada bsicos. A linguagem em case sensitive, o que signica 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 nalizador de enunciados.

3.2

Variveis

A declarao de variveis deve ser feita dentro de um bloco especco, 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 m-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 identicadores separados por virgula, seguido de um :, seguido de um tipo, seguido, nalmente, 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, nal, etc) no so suportados. Os tipos primitivos suportados encontram-se na tabela 2.1 A m 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, identicadores (nomes de variveis, funes e do algoritmo) no podem ter acentos ou caracteres especiais como $, #, etc. A denio de um identicador 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 identicadores 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 denio do bloco e sua (falta de) semelhana com o Pascal. Todas os blocos em G-Portugol tentam seguir o formato nome/m-nome, em favor da uniformidade e em detrimento de excees lingusticas que confundem os estudantes. E, nalmente, o quarto ponto a ausncia de cdigo entre incio e m. 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 verica se o usurio maior de idade. Alguns pontos a serem considerados: G-Portugol 6

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 conitos. 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 m 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/m-variveis, blocos se tem seus respectivos e obrigatrios m-se. No h a opo de ignorar a denio 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 8

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 m 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 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'' //-------------//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 renar 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 denir 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 signica, 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 denida 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 denir 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: reita 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 articiais 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 conitos quanto a decises de design e restringir suas caractersticas. Portanto, embora as diretrizes marquem a base do design, muitas vezes, elas devem ser sacricadas 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 ecientes 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 denio 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 modicar 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 ca 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 diculta 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 innitivo. 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 signica 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 congurvel 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 m-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 especca 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 modicar 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 inuencia 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 nal (como m-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 m 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 nal. Embora os delimitadores do bloco no sejam incio e m, h um grau de semelhana mantido: o delimitador inicial omitido (uma vez que o cabealho entendido como delimitador inicial) e o delimitador nal o termo m- 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 nal, 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 prexo 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 prexo 0c ou 0C, seguido de algarismos entre 0 e 7 (ex. 0c61). Finalmente, representaes binrias so formadas pelo prexo 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 identicador. 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 denidos 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 modicada com o uso de parntesis. 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

Operador ou e | & =, <> >, >=, <, <= +, *, /, % +, -, , no, ()

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 nal 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 denidas 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 cam 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 m-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 nal, 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 modicado. 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 nal 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 dicultando 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 reetir 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 identicadores. 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, identicadores com underlines antes ou depois em seus nomes (como __leia_texto) devem ser evitados, pois muitos identicadores internos utilizam essas convenes de nomeao, e seu uso pode acarretar em conitos 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 denir 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 ML_COMMENT : "//" [^LF]* ('\n')? : "/*" ( ~('*') | '*' ~'/' )* "*/"

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

m-variveis caractere falso se faa m-para literais

Palavras-chave de G-Portugol algoritmo variveis inteiro literal lgico incio m ou e seno ento m-se m-enquanto para de matriz inteiros reais lgicos funo retorne

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 ; tp_prim_pl : "inteiros" | "reais" | "caracteres" | "literais" | "lgicos" ; stm_block : "incio" (stm_list)* "fim" ; stm_list : stm_attr
G-Portugol 24

"]")+ "de" tp_prim_pl

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