Você está na página 1de 3

Curso: Ciência da Computação

Disciplina: Compiladores
Professor: Bruno Aguilar da Cunha
Ano Letivo – 2018/1

Data da Atividade: 17/04/2018


INSTRUÇÕES
Trabalho prático sobre conceitos da etapa de Análise Sintática da disciplina de Compiladores.
1. A lista deve ser feita em até 4 integrantes. Entregar por e-mail.
2. E-mail para envio: bruno.cunha@prof.uniso.br
3. Assunto: TrabCompiladoresAS_CC-Nome1-Nome2-Nome3-Nome4 (Substituir Nome1,
Nome2, Nome3 e Nome4 pelo primeiro nome dos integrantes)
4. Mensagem: Nome completo dos integrantes da dupla ou trio com o RA.
Anexo: TrabCompiladoresAS_Nome1_Nome2_Nome3.gals (expressões regulares, tokens e
GLCs) e os 10 trechos de código.
5. Obs: Favor observar as regras. Atividades entregues fora do formato ou após a data não serão
consideradas!
6. A atividade deve ser entregue até dia 01/05.
INSTRUÇÕES

GALS é um ambiente para a geração de analisadores léxicos e sintáticos, desenvolvido


na Universidade Federal de Santa Catarina.
Esta ferramenta pode ser obtida em: http://gals.sourceforge.net

GALS é uma ferramenta de Software Livre. Seu código fonte é liberado sob a Licença
Publica GNU. (http://www.gnu.org).

Definição dos Aspectos Léxicos

Os aspectos léxicos de uma especificação GALS são definidos pela declaração dos Tokens
e pela declaração de Definições Regulares. Os Tokens definem quais construções léxicas
serão aceitas pelo Scanner e o valor léxico de cada uma destas construções. As Definições
Regulares atuam como expressões auxiliares para a definição de Tokens. O Analisador
Léxico gerado utilizará as expressões regulares dos token para a criação de um Autômato
Finito com múltiplos estados finais, cada um deles correspondendo a um
dos Tokens declarados.

Definições Regulares
Uma definição sempre segue a forma:
[identificador] : [expressão regular]
Cada linha do campo de definições pode conter apenas uma definição regular.
As definições aqui declaradas poderão ser utilizadas em outras expressões regulares,
utilizando seu identificador entre { e }.

Definição dos Aspectos Sintáticos

Os Aspectos Sintáticos são compostos pela declaração de Símbolos Terminais (Tokens),


Símbolos Não-Terminais e Produções.

Símbolos Terminais (Tokens)

O modo como estes símbolos são declarados depende do tipo de projeto que está sendo
feito.
Analisadores Léxico e Sintático conjuntos
Neste tipo de projeto os Tokens declarados na Especificação Léxica são tomados como
Símbolos Terminais.

Símbolos Não-Terminais

O Símbolos Não-Terminais devem ser todos declarados antes de poderem ser utilizados
em produções. Sua forma é a de um identificador entre < e >. Assim como no caso dos
Tokens, apenas um símbolo pode ser declarado por linha.

O primeiro símbolo declarado é considerado o símbolo inicial da gramática.

Produções

A declaração das produções segue um formato baseado na notação BNF:


<não-terminal> ::= <lista de símbolos> | <lista de símbolos> | ... ;

Pode-se agrupar as definições ou deixá-las separadas, ou seja:

<A> ::= <B> | <C> ;


é igual a:
<A>::= <B>;
<A> ::= <C>;

Somente são aceitos nas produções símbolos já previamente declarados. O uso de um


símbolo (terminal ou não=terminal) não declarado gera um erro semântico.

Uma exceção a essa regra diz respeito ao símbolo terminal especial î (letra i, com um
acento circunflexo), que representa o símbolo epsilon (sentença vazia).

Restrições

Existem restrições impostas à forma das produções, de acordo com a classe de analisador
sintático que se pretende gerar. Para Analisadores Descendentes (LL e Descendente
Recursivo) não é permitido que a gramática possua Recursão à Esquerda ou que não esteja
na sua Forma Fatorada. A tentativa de se gerar um analisador com uma gramática neste
estado resultará em erro.

Atividades a serem realizadas pelo grupo:

Especificar como serão as formações dos símbolos (tokens) de uma linguagem de


programação simplificada através de expressões regulares e especificando as regras
sintáticas através de gramáticas livres de contexto (GLCs). Considerando a análise léxica,
deve ser descartado espaços em branco e comentários.

A linguagem de programação simplificada deverá realizar: soma, subtração, divisão e


multiplicação, entre variáveis (identificadores) ou números, seguindo a ordem de
precedência usual para operações matemáticas. Para o encerramento de comandos, o
token “;” será o delimitador utilizado.

As variáveis definidas (identificadores), devem ser formadas por letras maiúsculas e/ou
minúsculas, podendo também conter números ou o símbolo “_”.
Palavras reservadas da linguagem: “begin”, “end”, “if”, “then”, “else”, “while”, “do”, “print”,
“for”.

Comandos permitidos:

if (expressão-condicional) then Comando

if (expressão-condicional) then Comando else Comando

while (expressão-condicional) do Comando

print(expressão); //Comando para impressão

for(valor_inicial; expressão-condicional; incremento) Comando

Identificador := Expressão Matemática (que também pode ser um único número);


//Comando de atribuição

Comando: Caso o comando seja uma lista de comandos, deve iniciar com “Begin” e
finalizar com “End”.

Expressão: Pode ser uma variável (identificador) ou um número.

Expressão-Condicional: É uma expressão na qual deve haver uma comparação lógica entre
duas variáveis (identificadores) ou entre uma expressão matemática e um número, através
dos operadores relacionais (<, >, <=. >=, !=, ==) ou operadores lógicos (&&, ||).

Valor_Inicial: é uma variável que recebe um valor a partir de uma operação de atribuição.

Incremento: é uma variável que recebe uma operação de incremento aditivo ou subtrativo,
por exemplo: a++ ou a--.

Após a definição das expressões regulares e gramáticas livres de contexto que definam as
especificações da linguagem acima, utilizar o simulador disponível na ferramenta GALS
para realizar os testes com trechos de código que atendam a linguagem especificada. Para
realizar os testes, deve ser especificado na ferramenta a opção para gerar o alisador léxico
e sintático e também especificar o tipo de análise sintática a ser utilizada. Para o trabalho
em questão, pode ser usada qualquer uma das análises descendentes (recursiva ou LL(1)).

A dupla deverá fazer 10 trechos de código (entradas) de exemplo, sendo que 5 delas devem
estar corretas, ou seja, não devem ter nenhum erro léxico ou sintático. As outras cinco
entradas precisam ter ao menos um erro léxico ou erro sintático. Os erros devem ser
distintos para cada trecho de código utilizado.

Cada equipe de alunos deverá salvar as expressões regulares e as GLCs definidas no


GALS, através do software, em um arquivo do tipo .gals.

Você também pode gostar