Trabalho da disciplina Compiladores sob orientação da Profª Drª Thatyana de Faria Piola Seraphim, no curso de Engenharia da Computação - Universidade Federal de Itajubá.
Objetivo: criar, desenvolver e implementar um analisador léxico e um analisador sintático. Suporte à comandos de: -Atribuição -Entrada e saída -Condicionais -Repetição Suporte à operadores relacionais, lógicos e aritméticos. Implementação Bison/Yacc + FLEX.
Manual
Um 'identificador' é uma variável que pode ser um caracter de 'a' à 'z' ou de 'A' à 'Z' ( [a-zA-Z] ). Um 'termo' é um valor que pode ser um identificador ou um número. Uma 'expressão' é um valor que pode ser representado por números ou expressões algébricas, e podem conter identificadores ( [0-9]+ | exp ). Uma 'condição' é uma expressão envolvendo um identificador, um operador relacional e uma expressão (identificador operador_relacional expressão).
Comando de atribuição:
identificador = expressão;
Comando de condicional (if-then):
se condição entao identificador = expressão;
Para o comando de condicional, o compilador gerará um arquivo chamado "programaCriado.c" com o respectivo código executado, que pode então ser compilado com o gcc.
Comando de repetição 'enquanto-faça'(while):
enquanto identificador operador_relacional expressão faca identificador = identificador operador termo;
Programas exemplos
a = 2;
b = 5;
enquanto b < 50 faca b = b * a;
imprima b;
a = 1;
b = 2;
c = 4;
se a == c-b/2 entao a = 10;
imprima a;
a = 2;
b = 3;
c = b/a; /
enquanto c < b*a faca c = c * a;
imprima c;
Instruções de uso
Enquanto no diretório do projeto, execute os seguintes comandos:
- yacc -d statements.y
- flex tokens.l
- gcc y.tab.c lex.yy.c -o programa
Depois desse procedimento, execute o programa.
Expresões dos tokens
Token | Retorno |
---|---|
imprima | |
sair | exit_command |
se | tokenIf |
entao | tokenThen |
senao | tokenElse |
enquanto | tokenWhile |
faca | tokenDo |
>= | tokenIf |
<= | tokenIf |
> | tokenGE |
< | tokenLE |
== | tokenEQ |
!= | tokenNE |
&& | tokenAND |
[a-zA-Z] | yylval.id = yytext[0] e identifier |
[a-zA-Z]+ | yylval.str = yytext e word |
0-9]+ | yylval.num = atoi(yytext) e number |
[ \t\n] | ; |
[-+=;*/^%] | yytext[0] |
. | ECHO e yyerror ("token nao reconhecido") |
Árvore de derivação para a cadeia a = b + c
Autômatos finitos determinísticos