Escolar Documentos
Profissional Documentos
Cultura Documentos
Objetivos:
Bibliografia:
Sumário
1 INTRODUÇÃO .................................................................................................................... 3
2 O MODELO DE COMPILAÇÃO DE ANÁLISE E SÍNTESE ......................................................... 4
3 O CONTEXTO DE UM COMPILADOR ................................................................................... 5
4 ANÁLISE LÉXICA ................................................................................................................. 6
5 ANÁLISE SINTÁTICA E SEMÂNTICA ..................................................................................... 7
5.1 As fases da análise .....................................................................................................8
6 TRADUÇÃO DIRIGIDA PELA SINTAXE – Análise semântica .................................................. 9
6.1 Notação pósfixa ......................................................................................................... 9
6.2 Análise semântica (continuação).............................................................................. 10
6.3 Tabela de Símbolos .................................................................................................. 10
6.4 Geração de Código .................................................................................................. 10
6.5 Ferramentas utilizadas na construção de um compilador ......................................... 10
6.6 Definições ................................................................................................................ 10
7 ÁRVORES GRAMATICAIS .................................................................................................. 12
8 EXPRESSÕES REGULARES ................................................................................................. 13
8.1 Definições formais para expressões regulares .......................................................... 13
9 ANÁLISE GRAMATICAL..................................................................................................... 15
9.1 Análise Gramatical Top-Down .................................................................................. 15
9.2 Recursividade à Esquerda ........................................................................................ 16
9.2.1 Eliminação da recursividade à Esquerda ........................................................... 17
10 GRAMÁTICA LIVRE DE CONTEXTO ................................................................................ 18
11 LEX E YACC (Flex e Bison) ............................................................................................. 19
11.1 Primeira parte do arquivo Lex: Declarações ............................................................. 19
11.2 Segunda parte do arquivo Lex: Regras de tradução .................................................. 19
11.3 Terceira parte do arquivo Lex: Procedimentos Auxiliares ......................................... 20
11.4 Exemplo Lex e Yacc .................................................................................................. 22
12 TABELAS DE SÍMBOLOS................................................................................................ 24
12.1 Entradas da Tabela de Símbolos............................................................................... 24
COMPILADORES 3
1 INTRODUÇÃO
3 O CONTEXTO DE UM COMPILADOR
4 ANÁLISE LÉXICA
O identificador: montante
O símbolo de atribuição: :=
O identificador: deposito_inicial
O sinal de adição
O identificador: taxa_de_juros
O sinal de multiplicação
O número: 60
A notação pósfixa para uma expressão E pode ser definida indutivamente como se
segue:
1. Se E for uma variável ou uma constante, então a notação pósfixa para E
será o próprio E.
2. Se E for uma expressão da forma E1 op E2, onde op é qualquer operador
binário, então a forma pósfixa para E será E1E2op.
Exercício
6.6 Definições
CLASSE LEXEMA
identificador abc, x, y
if if
num 10, 9.5
op. relacionais <=, >
atrib =, :=
COMPILADORES 12
7 ÁRVORES GRAMATICAIS
8 EXPRESSÕES REGULARES
União: U
Concatenação: ●
Fechamento Kleene Star: *
Fechamento Kleene Positivo: +
Exercícios
a) L2 U L3
b) L1 U L2 U L3
COMPILADORES 14
c) L2●L3
d) L2*
+
e) L2
a) a (a* | b*) b
b) (c* (a | ( bc* ))*)
c) (a | b)* a ( a | b )*
+
d) ((( a* a ) b ) | b )
e) [abcd]
f) [c-h]
g) [a-zA-Z]
9 ANÁLISE GRAMATICAL
A Aα | β
COMPILADORES 17
onde α e β são sequências de terminais e não-terminais que não começam por A. Por
exemplo, em:
EE+T|T
(A = E; α = +T e β = T)
O não-terminal A é recursivo à esquerda porque a produção A Aα possui o
próprio A como seu símbolo mais à esquerda, no lado direito. A aplicação repetida
dessa produção constrói uma sequência de α´s à direita de A.
1) E E + T | T 2) B B * A | T
E TX B TX
X +TX | λ X *AX | λ
S λ
S a
S (S)
program teste
var
x, y : integer;
z : char;
begin
x := 10;
y := x;
if (x >= 10) then
begin
write(“teste”);
end;
end.
COMPILADORES 19
%%
regras de tradução
%%
procedimentos auxiliares
Exemplo:
%{
#include “calc.h”
#include <stdio.h>
#include <stdlib.h>
%}
/*Expressões regulares*/
branco [\t\n ]+
letra [A-Za-z]
digito [0-9]
identificador {letra}( _ | {letra} | {digito} )*
main()
{
yylex();
}
Para compilar:
_ lex ex1.l
Exercício Prático
%{
int nline;
%}
%%
%%
int main()
COMPILADORES 21
{
yylex();
printf(“\nFim de programa de %d linhas”,nline);
}
O programa Lex gera o que é chamado de “Lexer”. Isto é, uma função que pega
uma stream de caracteres como foi entrada, e sempre que ela vê um grupo de caracteres
que casa um padrão, realiza uma determinada ação. Um exemplo bem simples:
%{
#include<stdio.h>
%}
%%
%{
#include<stdio.h>
%}
%%
[0-9]+ printf(“\nNúmero”);
[a-zA-Z][_a-zA-Z0-9]* printf(“\nIdentificador”);
Para compilar:
_ yacc –d ex4.y
_ lex ex4.l
_ gcc –o ex4.out y.tab.c –lfl (éle éfe éle)
faz idéia do que são “streams de entrada”, ele precisa de tokens preprocessados. Para
auxiliar no trabalho do Yacc, podemos escrever nosso próprio “tokenizer” ou usar o Lex.
%{
#include “y.tab.h”
%}
ID [A-Za-z][A-Za-z0-9_]*
%%
%%
%{
#include<stdio.h>
%}
%token Tbegin
%token Tend
%token Tassign
%token Tidentifier
%token Tnumber
%left ‘+’
%left ‘-’
%start inicio
%%
COMPILADORES 23
%%
int main()
{
yyparse();
}
int yyerror(char *s)
{
fprintf(stderr, “%s \n”, s);
}
#include “lex.yy.c”
COMPILADORES 24
12 TABELAS DE SÍMBOLOS