Análise Sintática – Parte 1 Subfases: –Análise léxica (scanning): transforma o texto do...

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, 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).

Transcript of Análise Sintática – Parte 1 Subfases: –Análise léxica (scanning): transforma o texto do...

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,

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,

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,

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,

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,

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,

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,

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,

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,

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,

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,

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,

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,

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,

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,

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,

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,

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,

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,

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,

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,

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,

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,

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,

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,

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,

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,

parse

private void parse ( ) { currentTerminal = first input terminal; parseSentence( ); check that no terminal follows the sentence}