A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

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,

Apresentações semelhantes


Apresentação em tema: "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,"— Transcrição da apresentação:

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 : Integer in ! new year (comentário) y := y + 1 let var Ident. y colon : Ident. Integer Ident. y in becomes := Ident. y op + intlit 1 eot

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

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

5 Programa após parsing (3) Ident.op V-name Single-Command Expression Primary-Expr. Expression Int-Lit Primary-Expr. Ident. y becomes := op + intlit 1 Ident. y in Ident. V-name eot

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

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 (Operator primary-Expression)* primary-Expression ::= Identifier | ( Expression ) Identifier ::= a | b | c | d | e Operator ::= + | - | * | /

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-Command else 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-Command Control-Variable ::= Identifier To-or-Downto ::= to | downto single-Command ::= for Identifier := Expression (to | downto) Expression do single-Command

16 Starter sets (conjuntos iniciais) starters [[X]] é o conjunto de símbolos terminais que podem iniciar uma string gerada por X starters[[his | her | its]] = {h,i} starters[[(re)*set]] = {r,s}

17 Starter sets: definição starters[[  ]] = {} starters[[t]] = {t} starters[[XY]] = starters[[X]]  starters[[Y]], se X gera  starters[[XY]] = starters[[X]], se X não gera  starters[[X|Y]] = starters[[X]]  starters[[Y]] starters[[X*]] = starters[[X]]

18 Starter sets: exemplo starters[[Expression]] = starters[[primary-Expression (Operator primary-Expression)*]] = starters[[primary-Expression]] = starters[[identifier]]  starters[[ ( Expression ) ]] = starters[[ a | b | c | d | e ]]  { ( } = { a, b, c, d, e, ( }

19 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)

20 Gramática de micro-inglês Sentence ::= Subject Verb Object. Subject ::= I | a Noun | the Noun Object ::= me | a Noun | the Noun Noun ::= cat | mat | rat Verb ::= like | is | see | sees

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

22 Bottom-up parsing the cat sees a rat. SubjectObject Verb Sentence Noun

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

24 Top-down parsing the cat sees a rat. SubjectObjectVerb Sentence Noun

25 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();

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

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

28 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 }

29 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 }

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


Carregar ppt "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,"

Apresentações semelhantes


Anúncios Google