![Page 1: Análise Sintática – Parte 1 Subfases: –Análise léxica (scanning): transforma o texto do programa em uma sequëncia de tokens (símbolos como identificadores,](https://reader033.vdocuments.pub/reader033/viewer/2022061618/552fc141497959413d8df54c/html5/thumbnails/1.jpg)
Análise Sintática – Parte 1
• Subfases:– Análise léxica (scanning): transforma o texto
do programa em uma sequëncia de tokens (símbolos como identificadores, literais, operadores, palavras-chave, pontuação etc.
– Parsing: verifica a seqüencia de tokens para determinar a estrutura das frases.
– Representação da estrutura das frases (árvore sintática abstrata).
![Page 2: Análise Sintática – Parte 1 Subfases: –Análise léxica (scanning): transforma o texto do programa em uma sequëncia de tokens (símbolos como identificadores,](https://reader033.vdocuments.pub/reader033/viewer/2022061618/552fc141497959413d8df54c/html5/thumbnails/2.jpg)
Programa e seqüencia de tokens
let var y : Integerin ! new year (comentário) y := y + 1
let
let
var
var
Ident.
y
colon
:
Ident.
Integer
Ident.
y
in
in
becomes
:=
Ident.
y
op
+
intlit
1
eot
![Page 3: Análise Sintática – Parte 1 Subfases: –Análise léxica (scanning): transforma o texto do programa em uma sequëncia de tokens (símbolos como identificadores,](https://reader033.vdocuments.pub/reader033/viewer/2022061618/552fc141497959413d8df54c/html5/thumbnails/3.jpg)
Programa após parsing (1)
Declaration
Program
Single-Command
…
Single-Command
…
![Page 4: Análise Sintática – Parte 1 Subfases: –Análise léxica (scanning): transforma o texto do programa em uma sequëncia de tokens (símbolos como identificadores,](https://reader033.vdocuments.pub/reader033/viewer/2022061618/552fc141497959413d8df54c/html5/thumbnails/4.jpg)
Programa após parsing (2)
Declaration
Single-Declaration
Ident.
Type-Denoter
Ident.
let
let
var
var
Ident.
y
colon
:
Ident.
Integer
in
in
![Page 5: Análise Sintática – Parte 1 Subfases: –Análise léxica (scanning): transforma o texto do programa em uma sequëncia de tokens (símbolos como identificadores,](https://reader033.vdocuments.pub/reader033/viewer/2022061618/552fc141497959413d8df54c/html5/thumbnails/5.jpg)
Programa após parsing (3)
Ident. opV-name
Single-Command
Expression
Primary-Expr.
Expression
Int-LitPrimary-Expr.
Ident.
y
becomes
:=
op
+
intlit
1Ident.
y
in
in
Ident.V-name
eot
![Page 6: Análise Sintática – Parte 1 Subfases: –Análise léxica (scanning): transforma o texto do programa em uma sequëncia de tokens (símbolos como identificadores,](https://reader033.vdocuments.pub/reader033/viewer/2022061618/552fc141497959413d8df54c/html5/thumbnails/6.jpg)
SimpleV.
Abstract Syntax Trees
1+
Program
LetCommand
AssignCommand
Op. IntLit.
y
Ident.
y
Ident.
SimpleV.
IntExpr.VnameExpr.
BinaryExpr.
y
Ident.
Integer
Ident.
SimpleT.
VarDeclaration
![Page 7: Análise Sintática – Parte 1 Subfases: –Análise léxica (scanning): transforma o texto do programa em uma sequëncia de tokens (símbolos como identificadores,](https://reader033.vdocuments.pub/reader033/viewer/2022061618/552fc141497959413d8df54c/html5/thumbnails/7.jpg)
Tokens em Java
public class Token {public byte kind;public String spelling;public Token (byte kind, String spelling) { this.kind = kind; this.spelling = spelling;}…
![Page 8: Análise Sintática – Parte 1 Subfases: –Análise léxica (scanning): transforma o texto do programa em uma sequëncia de tokens (símbolos como identificadores,](https://reader033.vdocuments.pub/reader033/viewer/2022061618/552fc141497959413d8df54c/html5/thumbnails/8.jpg)
Tokens em Java
…public final static byte IDENTIFIER = 0, INTLITERAL = 1, OPERATOR = 2, BEGIN = 3, CONST = 4, DO = 5, ELSE = 6, END = 7, IF = 8, IN = 9, LET = 10, THEN = 11, VAR = 12, WHILE = 13, SEMICOLON = 14, COLON = 15, BECOMES = 16, IS = 17, LPAREN = 18, RPAREN = 19, EOT = 20;}
![Page 9: Análise Sintática – Parte 1 Subfases: –Análise léxica (scanning): transforma o texto do programa em uma sequëncia de tokens (símbolos como identificadores,](https://reader033.vdocuments.pub/reader033/viewer/2022061618/552fc141497959413d8df54c/html5/thumbnails/9.jpg)
Gramáticas
• Uso de EBNF: BNF + expressões regulares:– | , *, ( )
• Exemplos:– Mr |Ms– M (r|s)– ps*t– Ba(na)*– M(r|s)*
![Page 10: Análise Sintática – Parte 1 Subfases: –Análise léxica (scanning): transforma o texto do programa em uma sequëncia de tokens (símbolos como identificadores,](https://reader033.vdocuments.pub/reader033/viewer/2022061618/552fc141497959413d8df54c/html5/thumbnails/10.jpg)
BNF estendida
Expression ::= primary-Expression (Operator primary-Expression)*primary-Expression ::= Identifier | ( Expression )Identifier ::= a | b | c | d | eOperator ::= + | - | * | /
![Page 11: Análise Sintática – Parte 1 Subfases: –Análise léxica (scanning): transforma o texto do programa em uma sequëncia de tokens (símbolos como identificadores,](https://reader033.vdocuments.pub/reader033/viewer/2022061618/552fc141497959413d8df54c/html5/thumbnails/11.jpg)
Transformações em gramáticas: Fatoração à esquerda
• X Y | X Z
• X (Y | Z)
![Page 12: Análise Sintática – Parte 1 Subfases: –Análise léxica (scanning): transforma o texto do programa em uma sequëncia de tokens (símbolos como identificadores,](https://reader033.vdocuments.pub/reader033/viewer/2022061618/552fc141497959413d8df54c/html5/thumbnails/12.jpg)
Fatoração à esquerda: exemplo
• Single-command ::= V-name := expression | if Expression then single-Command | if Expression then single-Command else single-Command
• Single-command ::= V-name := expression | if Expression then single-Command ( | else single-Command)
![Page 13: Análise Sintática – Parte 1 Subfases: –Análise léxica (scanning): transforma o texto do programa em uma sequëncia de tokens (símbolos como identificadores,](https://reader033.vdocuments.pub/reader033/viewer/2022061618/552fc141497959413d8df54c/html5/thumbnails/13.jpg)
Transformações: Eliminação de recursão à esquerda
• N ::= X | N Y
• N ::= X (Y)*
![Page 14: Análise Sintática – Parte 1 Subfases: –Análise léxica (scanning): transforma o texto do programa em uma sequëncia de tokens (símbolos como identificadores,](https://reader033.vdocuments.pub/reader033/viewer/2022061618/552fc141497959413d8df54c/html5/thumbnails/14.jpg)
Eliminação de recursão à esquerda: exemplo
• Identifier ::= Letter | Identifier Letter | Identifier Digit
• Identifier ::= Letter | Identifier (Letter | Digit)
• Identifier ::= Letter (Letter | Digit)*
![Page 15: Análise Sintática – Parte 1 Subfases: –Análise léxica (scanning): transforma o texto do programa em uma sequëncia de tokens (símbolos como identificadores,](https://reader033.vdocuments.pub/reader033/viewer/2022061618/552fc141497959413d8df54c/html5/thumbnails/15.jpg)
Transformações: substituição de símbolos não terminais
• single-Command ::= for Control-Variable := Expression To-or-Downto Expression do single-CommandControl-Variable ::= IdentifierTo-or-Downto ::= to | downto
• single-Command ::= for Identifier := Expression (to | downto) Expression do single-Command
![Page 16: Análise Sintática – Parte 1 Subfases: –Análise léxica (scanning): transforma o texto do programa em uma sequëncia de tokens (símbolos como identificadores,](https://reader033.vdocuments.pub/reader033/viewer/2022061618/552fc141497959413d8df54c/html5/thumbnails/16.jpg)
Parsing
• Algorítmos de parsing: são classificados em bottom-up parsing e top-down parsing
• Definem a ordem em que a parse tree é construída (na prática ela não é construída de verdade)
![Page 17: Análise Sintática – Parte 1 Subfases: –Análise léxica (scanning): transforma o texto do programa em uma sequëncia de tokens (símbolos como identificadores,](https://reader033.vdocuments.pub/reader033/viewer/2022061618/552fc141497959413d8df54c/html5/thumbnails/17.jpg)
Gramática de micro-inglês
• Sentence ::= Subject Verb Object .Subject ::= I | a Noun | the NounObject ::= me | a Noun | the NounNoun ::= cat | mat | ratVerb ::= like | is | see | sees
![Page 18: Análise Sintática – Parte 1 Subfases: –Análise léxica (scanning): transforma o texto do programa em uma sequëncia de tokens (símbolos como identificadores,](https://reader033.vdocuments.pub/reader033/viewer/2022061618/552fc141497959413d8df54c/html5/thumbnails/18.jpg)
Bottom-up parsing
• O parser examina os símbolos terminais da string de entrada, da esquerda para a direita, e reconstrói a árvore sintática de baixo (nós terminais) para cima (em direção ao nó-raiz).
• Exemplo: the cat sees a rat .
![Page 19: Análise Sintática – Parte 1 Subfases: –Análise léxica (scanning): transforma o texto do programa em uma sequëncia de tokens (símbolos como identificadores,](https://reader033.vdocuments.pub/reader033/viewer/2022061618/552fc141497959413d8df54c/html5/thumbnails/19.jpg)
Bottom-up parsing
the cat sees a rat .
Subject ObjectVerb
Sentence
Noun Noun
![Page 20: Análise Sintática – Parte 1 Subfases: –Análise léxica (scanning): transforma o texto do programa em uma sequëncia de tokens (símbolos como identificadores,](https://reader033.vdocuments.pub/reader033/viewer/2022061618/552fc141497959413d8df54c/html5/thumbnails/20.jpg)
Top-down parsing
• O parser examina os símbolos terminais da string de entrada, da esquerda para a direita, e reconstrói a árvore sintática de cima (nó-raiz) para baixo (em direção aos nós terminais).
• Exemplo: the cat sees a rat .
![Page 21: Análise Sintática – Parte 1 Subfases: –Análise léxica (scanning): transforma o texto do programa em uma sequëncia de tokens (símbolos como identificadores,](https://reader033.vdocuments.pub/reader033/viewer/2022061618/552fc141497959413d8df54c/html5/thumbnails/21.jpg)
Top-down parsing
the cat sees a rat .
Subject ObjectVerb
Sentence
Noun Noun
![Page 22: Análise Sintática – Parte 1 Subfases: –Análise léxica (scanning): transforma o texto do programa em uma sequëncia de tokens (símbolos como identificadores,](https://reader033.vdocuments.pub/reader033/viewer/2022061618/552fc141497959413d8df54c/html5/thumbnails/22.jpg)
Recursive descent parsing
• Top-down.• Grupo de N métodos parseN, um para cada
símbolo não-terminal.• Elimine recursão à esquerda e fatorize à esquerda.• Cada método faz o parsing de uma frase-N:
private void parseNoun();private void parseVerb();private void parseSubject();private void parseObject();private void parseSentence();
![Page 23: Análise Sintática – Parte 1 Subfases: –Análise léxica (scanning): transforma o texto do programa em uma sequëncia de tokens (símbolos como identificadores,](https://reader033.vdocuments.pub/reader033/viewer/2022061618/552fc141497959413d8df54c/html5/thumbnails/23.jpg)
Parser class
Public class Parser {private TerminalSymbol currentTerminal;private void accept (TerminalSymbol expectedTerminal) { if (currentTerminal matches expectedTerminal) currentTerminal = next input terminal; else report a syntax error}
![Page 24: Análise Sintática – Parte 1 Subfases: –Análise léxica (scanning): transforma o texto do programa em uma sequëncia de tokens (símbolos como identificadores,](https://reader033.vdocuments.pub/reader033/viewer/2022061618/552fc141497959413d8df54c/html5/thumbnails/24.jpg)
parseSentence
private void parseSentence ( ) { parseSubject( ); parseVerb( ); parseObject( ); accept(‘.’);}
![Page 25: Análise Sintática – Parte 1 Subfases: –Análise léxica (scanning): transforma o texto do programa em uma sequëncia de tokens (símbolos como identificadores,](https://reader033.vdocuments.pub/reader033/viewer/2022061618/552fc141497959413d8df54c/html5/thumbnails/25.jpg)
parseSubject
private void parseSubject ( ) { if (currentTerminal matches ‘I’) accept(‘I’); else if (currentTerminal matches ‘a’) { accept (‘a’); parseNoun( ); } else if (currentTerminal matches ‘the’) { accept (‘the’); parseNoun( ); } else report syntax error}
![Page 26: Análise Sintática – Parte 1 Subfases: –Análise léxica (scanning): transforma o texto do programa em uma sequëncia de tokens (símbolos como identificadores,](https://reader033.vdocuments.pub/reader033/viewer/2022061618/552fc141497959413d8df54c/html5/thumbnails/26.jpg)
parseNoun
private void parseNoun ( ) { if (currentTerminal matches ‘cat’) accept(‘cat’); else if (currentTerminal matches ‘mat’) accept (‘mat’); else if (currentTerminal matches ‘rat’) accept (‘rat’); else report syntax error}
![Page 27: Análise Sintática – Parte 1 Subfases: –Análise léxica (scanning): transforma o texto do programa em uma sequëncia de tokens (símbolos como identificadores,](https://reader033.vdocuments.pub/reader033/viewer/2022061618/552fc141497959413d8df54c/html5/thumbnails/27.jpg)
parse
private void parse ( ) { currentTerminal = first input terminal; parseSentence( ); check that no terminal follows the sentence}