Download presentation
Presentation is loading. Please wait.
Published byKali Seals Modified over 10 years ago
1
Análise Sintática – Parte 2 Árvores Sintáticas Abstratas (ASTs) Scanning
2
Representação da árvore (Programa) Program C
3
ASTs em Java – Programas public abstract class AST { … } public class Program extends AST { public Command C; … }
4
Representação da árvore (Comando) IfCommand EC2C2 WhileCommand EC LetCommand DC AssignCommand E CallCommand IdentifierE spelling SequentialCommand C1C1 C2C2 V C1C1
5
ASTs em Java – Comandos public abstract class Command extends AST { … } public class AssignCommand extends Command { public Vname V; public Expression E; … } public class CallCommand extends Command { public Identifier I; public Expression E; … }
6
ASTs em Java – Comandos (2) public class SequentialCommand extends Command { public Command C1,C2; … } public class IfCommand extends Command { public Expression E; public Command C1,C2; … }
7
ASTs em Java – Comandos (3) public class WhileCommand extends Command { public Expression E; public Command C; … } public class LetCommand extends Command { public Declaration D; public Command C; … }
8
Representação da árvore (Expressão) BinaryExpression E1E1 E2E2 UnaryExpression OperatorE IntegerExpression IntegerLiteral spelling VnameExpression V Operator spelling
9
ASTs em Java – Expressões public abstract class Expression extends AST { … } public class UnaryExpression extends Expression { public Operator O; public Expression E; … } public class BinaryExpression extends Expression { public Operator O; public Expression E1,E2; … }
10
Representação da árvore (V-name) SimpleVname Identifier spelling
11
ASTs em Java – Vname public abstract class Vname extends AST { … } public class SimpleVname extends Vname { public Identifier I; … }
12
Representação da árvore (Declaração) SequentialDeclaration D2D2 ConstDeclaration IdentifierE spelling D1D1 VarDeclaration IdentifierE spelling
13
ASTs em Java – Declaração public abstract class Declaration extends AST { … } public class ConstDeclaration extends Declaration { public Identifier I; public Expression E; … } public class VarDeclaration extends Declaration { public Identifier I; public TypeDenoter T; … }
14
Representação da árvore (Denotador de Tipos) SimpleTypeDenoter Identifier spelling
15
ASTs em Java – Denotador de Tipos public abstract class TypeDenoter extends AST { … } public class SimpleTypeDenoter extends TypeDenoter { public Identifier I; … }
16
ASTs em Java – Terminais public abstract class Terminal extends AST { public String spelling; … } public class Identifier extends Terminal { …} public class IntegerLiteral extends Terminal { …} public class Operator extends Terminal { …}
17
ASTs em Java – Construção da árvore private AST N parseN ( ) { AST N itsAST; parse N, at the same time constructing itsAST return itsAST; }
18
ASTs em Java – Exemplo: ParseSingleDeclaration private Declaration parseSingleDeclaration ( ) { Declaration declAST; switch (currentToken.kind) { case Token.CONST: { acceptIt( ); Identifier iAST = parseIdentifier( ); accept(Token.IS); Expression eAST = parseExpression( ); declAST = new ConstDeclaration(iAST, eAST); } break; case Token.VAR: … return declAST; }
19
ASTs em Java – Exemplo: ParseCommand private Declaration parseCommand ( ) { Command c1AST = parseSingleCommand( ); while (currentToken.kind == Token.SEMICOLON) { acceptIt( ); Command c2AST = parseSingleCommand( ); c1AST = new SequentialCommand(c1AST, c2AST); } return c1AST; }
20
ASTs em Java – Exemplo: ParseIdentifier private Identifier parseIdentifier ( ) { Identifier idAST; if (currentToken.kind == Token.IDENTIFIER) { idAST = new Identifier(currentToken.spelling); currentToken = scanner.scan( ); } else report error return idAST; }
21
ASTs em Java – Exemplo: Parser public class Parser { private Token currentToken; … public Program parse ( ) { currentToken = scanner.scan( ); Program progAST = parseProgram( ); if (currentToken.kind != Token.EOT) report error return progAST; }
22
Scanning (Análise léxica) funciona de forma semelhante ao parser, mas em um maior nível de detalhe. Especificado usando expressões regulares/EBNF (Gramática léxica) Símbolos terminais são caracteres
23
Especificação do Scanner Token ::= Identifier | Integer-Literal | Operator | ; | : | := | ~ | ( | ) | eot Identifier ::= Letter | Identifier Letter | Identifier Digit Integer-Literal ::= Digit | Integer-Literal Digit Operator ::= + | - | * | / | | = | \ Separator ::= Comment | space | eol Comment ::= ! Graphic* eol
24
Especficação do Scanner (2) Token ::= Letter (Letter | Digit)* | Digit Digit* | + | - | * | / | | = | \ | ; | : | := | ~ | ( | ) | eot Separator ::= ! Graphic* eol | space | eol
25
Exemplo: Scanner private byte scanToken( ) { switch (currentChar) { case ‘a’: case ‘b’: … case ‘z’: takeIt( ); while (isLetter(currentChar) || isDigit(currentChar)) takeIt( ); return Token.IDENTIFIER; … case ‘\n’ : takeIt( ); return Token.EOL case ‘:’ : takeIt( ); if (currentChar == ‘=’) { takeIt(); return Token.BECOMES; } else return Token.COLON; …
26
Exemplo: Scanner (2) public class Scanner { private char currentChar = … private byte currentKind; private String currentSpelling; private void take (char expectedChar) {…} private void takeIt ( ) {…} private byte scanToken( ) {…} private void scanSeparator( ) {…}
27
Exemplo: Scanner (3) public class Scanner { … public Token scan ( ) { while (currentChar == ‘!’ || currentChar == ‘ ’ || currentChar == ‘\n’) scanSeparator( ); currentSpelling = new StringBuffer(“”); currentKind = scanToken( ); return new Token(currentKind, currentSpelling.toString); } }
28
Exemplo: Token public class Token { public byte kind; public String spelling; public Token (byte kind, String spelling) { this.kind = kind; this.spelling = spelling; if (kind == IDENTIFIER) verifica se é palavra reservada e muda o kind } }
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.