Download - Análises léxica e sintática
![Page 1: Análises léxica e sintática](https://reader036.vdocuments.pub/reader036/viewer/2022062301/568140c0550346895dac8532/html5/thumbnails/1.jpg)
Análises léxica e sintática Teoria e Implementação de Linguagens
Computacionais - IF688
Mauro La-Salette C. L. de AraújoCentro de Informática – CIn
Universidade Federal de Pernambuco – UFPE
![Page 2: Análises léxica e sintática](https://reader036.vdocuments.pub/reader036/viewer/2022062301/568140c0550346895dac8532/html5/thumbnails/2.jpg)
Roteiro
Visão geral Análise léxica
Definição Especificação Implementação Correspondência
Análise sintática Definição Especificação Implementação
Algoritmos de parsing e gramáticas Gramáticas ambíguas Sintaxe abstrata
![Page 3: Análises léxica e sintática](https://reader036.vdocuments.pub/reader036/viewer/2022062301/568140c0550346895dac8532/html5/thumbnails/3.jpg)
executável
Visão Geral
Análise sintática
Código fonte
AST
Análise semântica
Geração decódigo
AST decorada
Análiseléxica
Tokens
![Page 4: Análises léxica e sintática](https://reader036.vdocuments.pub/reader036/viewer/2022062301/568140c0550346895dac8532/html5/thumbnails/4.jpg)
Análise Léxica
![Page 5: Análises léxica e sintática](https://reader036.vdocuments.pub/reader036/viewer/2022062301/568140c0550346895dac8532/html5/thumbnails/5.jpg)
Definição
Fase da compilação responsável por extrair os tokens do código fonte de um programa.
if (n == 0) { return 1;} else { ...} RPAR LCUR
RCUR
if LPAR
return
else
"n"id
"0"intLit
assign
"1"intLit ...comm
![Page 6: Análises léxica e sintática](https://reader036.vdocuments.pub/reader036/viewer/2022062301/568140c0550346895dac8532/html5/thumbnails/6.jpg)
Especificação
Os tokens de uma linguagem comumente são especificados através de Expressões Regulares
[a-z][a-z0-9]* identifier
[0-9]+ intLiteral
![Page 7: Análises léxica e sintática](https://reader036.vdocuments.pub/reader036/viewer/2022062301/568140c0550346895dac8532/html5/thumbnails/7.jpg)
Implementação
Autômatos finitos
1 2
a-z a-z
0-9
ID
21 3
i f
IF
![Page 8: Análises léxica e sintática](https://reader036.vdocuments.pub/reader036/viewer/2022062301/568140c0550346895dac8532/html5/thumbnails/8.jpg)
Análise Sintática
![Page 9: Análises léxica e sintática](https://reader036.vdocuments.pub/reader036/viewer/2022062301/568140c0550346895dac8532/html5/thumbnails/9.jpg)
Definição
Fase da compilação responsável por determinar se uma dada cadeia de entrada pertence ou não à linguagem definida por uma gramática
Tem como entrada os tokens processados pela análise léxica
Produz uma estrutura comumente denominada AST – abstract syntax tree
![Page 10: Análises léxica e sintática](https://reader036.vdocuments.pub/reader036/viewer/2022062301/568140c0550346895dac8532/html5/thumbnails/10.jpg)
Especificação
BNF - Backus-Naur form
S, A, B, C, D : não-terminais
a,b,d: terminais
S ::= A | BA ::= C | DB ::= bbaC ::= abD ::= dab
Produções
![Page 11: Análises léxica e sintática](https://reader036.vdocuments.pub/reader036/viewer/2022062301/568140c0550346895dac8532/html5/thumbnails/11.jpg)
Implementação
Algoritmos de parsing e gramáticas
Classificação
Top-down
• Recursive-descent / LL(1)
Bottom-up
• LR, SLR, LALR, LR(k)
![Page 12: Análises léxica e sintática](https://reader036.vdocuments.pub/reader036/viewer/2022062301/568140c0550346895dac8532/html5/thumbnails/12.jpg)
Recursive descent
Algoritmo baseado em previsões
Funções mutuamente recursivas
Uma função para cada não-terminal
![Page 13: Análises léxica e sintática](https://reader036.vdocuments.pub/reader036/viewer/2022062301/568140c0550346895dac8532/html5/thumbnails/13.jpg)
Recursive descent
Desenvolvendo um recursive descent parser
Cada não terminal 'X' dará origem a um método/função parseX();
Produções do tipo 'A | B' darão origem a cláusulas cases
![Page 14: Análises léxica e sintática](https://reader036.vdocuments.pub/reader036/viewer/2022062301/568140c0550346895dac8532/html5/thumbnails/14.jpg)
Recursive descent
A ::= aBcC
B ::= CB | cC
C ::= da
parseA() { accept(‘a’); parseB(); accept(‘c’); parseC();}
parseB() { case (d): parseC(); parseB(); case (c): accept(‘c’); parseC();}
parseC() { accept(‘d’); accept(‘a’); }
![Page 15: Análises léxica e sintática](https://reader036.vdocuments.pub/reader036/viewer/2022062301/568140c0550346895dac8532/html5/thumbnails/15.jpg)
Recursive descent
A ::= aBcC
B ::= CB | CA
C ::= da
parseA() { accept(‘a’); parseB(); accept(‘c’); parseC();}
parseB() { case (d): parseC(); parseB(); case (d): parseC(); parseA();}
parseC() { accept(‘d’); accept(‘a’);}
![Page 16: Análises léxica e sintática](https://reader036.vdocuments.pub/reader036/viewer/2022062301/568140c0550346895dac8532/html5/thumbnails/16.jpg)
Recursive descent
Vantagens Fácil de implementar
Desvantagens Performance Gramática reconhecida possui restrições
Sem recursão à esquerdaDeve estar fatorada ...
![Page 17: Análises léxica e sintática](https://reader036.vdocuments.pub/reader036/viewer/2022062301/568140c0550346895dac8532/html5/thumbnails/17.jpg)
Recursive descent
A ::= aBC
B ::= CB | CA
C ::= da
A ::= aBC
B ::= CX
X ::= B | A
C ::= da
GramáticaLL(1)
![Page 18: Análises léxica e sintática](https://reader036.vdocuments.pub/reader036/viewer/2022062301/568140c0550346895dac8532/html5/thumbnails/18.jpg)
Gramáticas LL(1)
Left-to-right parse Leftmost-derivation 1-symbol-lookahead
![Page 19: Análises léxica e sintática](https://reader036.vdocuments.pub/reader036/viewer/2022062301/568140c0550346895dac8532/html5/thumbnails/19.jpg)
Gramáticas Ambíguas
Uma gramática é ambígua se a partir dela uma sentença pode dar origem a duas arvores de parsing
Problemáticas para a compilação
Eliminação de ambigüidade é quase sempre possível
Transformações na gramática
![Page 20: Análises léxica e sintática](https://reader036.vdocuments.pub/reader036/viewer/2022062301/568140c0550346895dac8532/html5/thumbnails/20.jpg)
Gramáticas Ambíguas
Caso clássico: gramática para expressões aritméticas
E ::= intLiteral | E '*' E | E '/' E | E '+' E | E '-' E |'(' E ')'
![Page 21: Análises léxica e sintática](https://reader036.vdocuments.pub/reader036/viewer/2022062301/568140c0550346895dac8532/html5/thumbnails/21.jpg)
Gramáticas Ambíguas
1 + 2 * 3
E
E E
E E
*
+ 3
21
E
E E
EE
+
*1
2 3
![Page 22: Análises léxica e sintática](https://reader036.vdocuments.pub/reader036/viewer/2022062301/568140c0550346895dac8532/html5/thumbnails/22.jpg)
Gramáticas Ambíguas
Solução: Transformar a gramática
* e / com maior precedência que + ou - Operadores associativos a esquerda
E ::= intLiteral | E '*' E | E '/' E | E '+' E | E '-' E |'(' E ')'
E ::= E '+' T | E '–' T | TT ::= T '*' F | T '/' F | FF ::= intLiteral |'(' E ')'
![Page 23: Análises léxica e sintática](https://reader036.vdocuments.pub/reader036/viewer/2022062301/568140c0550346895dac8532/html5/thumbnails/23.jpg)
Sintaxe abstrata
Apenas reconhecer se uma sentença pertence ou não a linguagem especificada por uma gramática não é o suficiente
É necessário produzir uma estrutura que sirva de base para a próxima fase do processo de compilação Parse trees nunca são montadas na prática
![Page 24: Análises léxica e sintática](https://reader036.vdocuments.pub/reader036/viewer/2022062301/568140c0550346895dac8532/html5/thumbnails/24.jpg)
AST – Abstract Syntax Tree
Capturam a essência da estrutura de uma gramática abstraindo não-terminais
Representação possível Java: Classes que possam se relacionar a fim de
montar uma árvore
Pode ser produzida através da inserção de ações semânticas no parser
![Page 25: Análises léxica e sintática](https://reader036.vdocuments.pub/reader036/viewer/2022062301/568140c0550346895dac8532/html5/thumbnails/25.jpg)
AST – Abstract Syntax Tree
IfThenElse ::= 'if' expr 'then' comm1 'else' comm2
return new IfThenElse(expr, comm1, comm2);
IfThenElse
expr : Expressioncomm1 : Commandcomm2 : Command
![Page 26: Análises léxica e sintática](https://reader036.vdocuments.pub/reader036/viewer/2022062301/568140c0550346895dac8532/html5/thumbnails/26.jpg)
Análises léxica e sintática Teoria e Implementação de Linguagens
Computacionais - IF688
Mauro La-Salette C. L. de AraújoCentro de Informática – CIn
Universidade Federal de Pernambuco – UFPE