1 / 27

Análise Sintática – Parte 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, literais, operadores, palavras-chave, pontuação etc. Parsing : verifica a seqüencia de tokens para determinar a estrutura das frases.

jorryn
Download Presentation

Análise Sintática – Parte 1

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

  2. 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

  3. Programa após parsing (1) Program Single-Command Declaration Single-Command … …

  4. Programa após parsing (2) Declaration Single-Declaration Type-Denoter Ident. Ident. let var Ident. colon Ident. in let var y : Integer in

  5. 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

  6. Abstract Syntax Trees Program LetCommand AssignCommand VarDeclaration BinaryExpr. SimpleV. VnameExpr. SimpleT. IntExpr. SimpleV. Ident. Ident. Ident. Op. IntLit. Ident. y Integer y y + 1

  7. Tokens em Java public class Token {public byte kind;public String spelling;public Token (byte kind, String spelling) { this.kind = kind; this.spelling = spelling;}…

  8. 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;}

  9. Gramáticas • Uso de EBNF: BNF + expressões regulares: • | , *, ( ) • Exemplos: • Mr |Ms • M (r|s) • ps*t • Ba(na)* • M(r|s)*

  10. BNF estendida Expression ::= primary-Expression (Operatorprimary-Expression)*primary-Expression ::= Identifier | (Expression)Identifier ::= a | b | c | d | eOperator ::= + | - | * | /

  11. Transformações em gramáticas: Fatoração à esquerda • X Y | X Z • X (Y | Z)

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

  13. Transformações: Eliminação de recursão à esquerda • N ::= X | N Y • N ::= X (Y)*

  14. Eliminação de recursão à esquerda: exemplo • Identifier ::= Letter | Identifier Letter | Identifier Digit • Identifier ::= Letter | Identifier (Letter | Digit) • Identifier ::= Letter (Letter | Digit)*

  15. 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

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

  17. 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

  18. 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 .

  19. Bottom-up parsing the cat sees a rat . Sentence Verb Subject Object Noun Noun

  20. 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 .

  21. Top-down parsing Sentence the cat sees a rat . Subject Verb Object Noun Noun

  22. 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();

  23. 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}

  24. parseSentence private void parseSentence ( ) { parseSubject( ); parseVerb( ); parseObject( ); accept(‘.’);}

  25. 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}

  26. 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}

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

More Related