270 likes | 649 Views
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.
E N D
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).
Programa e seqüencia de tokens let var y : Integerin ! new year (comentário) y := y + 1 let var Ident. colon Ident. in let var y : Integer in Ident. becomes Ident. op intlit eot y := y + 1
Programa após parsing (1) Program Single-Command Declaration Single-Command … …
Programa após parsing (2) Declaration Single-Declaration Type-Denoter Ident. Ident. let var Ident. colon Ident. in let var y : Integer in
Programa após parsing (3) Single-Command Expression Expression Primary-Expr. V-name Primary-Expr. V-name Ident. Int-Lit Ident. op op intlit eot in Ident. becomes Ident. + 1 in y := y
Abstract Syntax Trees Program LetCommand AssignCommand VarDeclaration BinaryExpr. SimpleV. VnameExpr. SimpleT. IntExpr. SimpleV. Ident. Ident. Ident. Op. IntLit. Ident. y Integer y y + 1
Tokens em Java public class Token {public byte kind;public String spelling;public Token (byte kind, String spelling) { this.kind = kind; this.spelling = spelling;}…
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;}
Gramáticas • Uso de EBNF: BNF + expressões regulares: • | , *, ( ) • Exemplos: • Mr |Ms • M (r|s) • ps*t • Ba(na)* • M(r|s)*
BNF estendida Expression ::= primary-Expression (Operatorprimary-Expression)*primary-Expression ::= Identifier | (Expression)Identifier ::= a | b | c | d | eOperator ::= + | - | * | /
Transformações em gramáticas: Fatoração à esquerda • X Y | X Z • X (Y | Z)
Fatoração à esquerda: exemplo • Single-command ::= V-name := expression | if Expression then single-Command | if Expression then single-Commandelse single-Command • Single-command ::= V-name := expression | if Expression then single-Command ( | else single-Command)
Transformações: Eliminação de recursão à esquerda • N ::= X | N Y • N ::= X (Y)*
Eliminação de recursão à esquerda: exemplo • Identifier ::= Letter | Identifier Letter | Identifier Digit • Identifier ::= Letter | Identifier (Letter | Digit) • Identifier ::= Letter (Letter | Digit)*
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
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)
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
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 .
Bottom-up parsing the cat sees a rat . Sentence Verb Subject Object Noun Noun
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 .
Top-down parsing Sentence the cat sees a rat . Subject Verb Object Noun Noun
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();
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}
parseSentence private void parseSentence ( ) { parseSubject( ); parseVerb( ); parseObject( ); accept(‘.’);}
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}
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}
parse private void parse ( ) { currentTerminal = first input terminal; parseSentence( );check that no terminal follows the sentence}