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

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

ANTLR ANother Tool for Language Recognition www.antlr.org Jobson Ronan (jrjs) Renato Viana (rvf)

Apresentações semelhantes


Apresentação em tema: "ANTLR ANother Tool for Language Recognition www.antlr.org Jobson Ronan (jrjs) Renato Viana (rvf)"— Transcrição da apresentação:

1 ANTLR ANother Tool for Language Recognition www.antlr.org Jobson Ronan (jrjs) Renato Viana (rvf)

2 Motivação Parsers criados com YACC tendem a ter baixa qualidade de mensagens de erro Erros em gramáticas do YACC são difíceis de entender. YACC informa um erro de "shift/reduce" ou "reduce/reduce" associado a uma dada regra da gramática Possibilidade de gerar Parsers para várias linguagens (C++, Java, C# e Python) Open-source

3 Características ANTLR gera recursive decent parsers e possui uma boa reportagem de erros. Parsers gerados pelo ANTLR são razoavelmente legíveis. Facilitando a depuração Possui boa documentação e grande quantidade de exemplos  Apesar disso, a curva de aprendizagem ainda é grande.

4 Aprendendo por exemplo Exp: Linguagem de expressões aritméticas  Suporta soma, subtração e multiplicação de inteiros  Suporta parêntesis para definir prioridades Ex:  2+3  1  5*(3+7)

5 Gramática Todas as gramáticas do ANTLR são subclasses de Lexer, Parser, or TreeParser  As regras são específicadas em uma notação EBNF class ExprParser extends Parser; expr: mexpr ((PLUS|MINUS) mexpr)* ; mexpr : atom (STAR atom)* ; atom: INT | LPAREN expr RPAREN ;

6 Lexer class ExprLexer extends Lexer; options { k=2; // needed for newline junk charVocabulary='\u0000'..'\u007F'; // allow ascii } LPAREN: '(' ; RPAREN: ')' ; PLUS : '+' ; MINUS : '-' ; STAR : '*' ; INT : ('0'..'9')+ ; WS : ( ' ' | '\r' '\n' | '\n' | '\t' ) {$setType(Token.SKIP);} ;

7 Gerando Executar ferramenta de geração $ java antlr.Tool expr.g Resultado ExprLexer.java ExprParser.java ExprParserTokenTypes.java

8 Testando Executar o parser import antlr.*; public class Main { public static void main(String[] args) throws Exception { ExprLexer lexer = new ExprLexer(System.in); ExprParser parser = new ExprParser(lexer); parser.expr(); }

9 Avaliando Expressões Avaliando expressões on-the-fly class ExprParser extends Parser; expr returns [int value=0] {int x;} : value=mexpr ( PLUS x=mexpr {value += x;} | MINUS x=mexpr {value -= x;} )* ; mexpr returns [int value=0] {int x;} : value=atom ( STAR x=atom {value *= x;} )* ; atom returns [int value=0] : i:INT {value=Integer.parseInt(i.getText());} | LPAREN value=expr RPAREN ;

10 Testando Alterações no método expr() import antlr.*; public class Main { public static void main(String[] args) throws Exception { ExprLexer lexer = new ExprLexer(System.in); ExprParser parser = new ExprParser(lexer); int x = parser.expr(); System.out.println(x); }

11 Problemas Mistura de interesses  Código de definição da gramática  Código de definição das ações  Código da linguagem alvo (Java) Solução  Gerar uma AST

12 Gerando ASTs Pequenas alterações na definição da gramática  Indica-se açucares sintáticos  Indica-se nomes dos nós Define-se um TreeParser

13 Alterações na gramática “^” Índica as raízes das sub-arvores “!” Índica os açucares sintáticos class ExprParser extends Parser; options { buildAST=true; } expr: mexpr ((PLUS^|MINUS^) mexpr)* ; mexpr : atom (STAR^ atom)* ; atom: INT | LPAREN! expr RPAREN! ;

14 Definindo TreeParser class ExprTreeParser extends TreeParser; options { importVocab=ExprParser; } expr returns [int r=0] { int a,b; } : #(PLUS a=expr b=expr) {r = a+b;} | #(MINUS a=expr b=expr) {r = a-b;} | #(STAR a=expr b=expr) {r = a*b;} | i:INT {r = (int)Integer.parseInt(i.getText());} ;

15 Testando import antlr.*; import antlr.collections.*; public class Main { public static void main(String[] args) throws Exception { ExprLexer lexer = new ExprLexer(System.in); ExprParser parser = new ExprParser(lexer); parser.expr(); AST t = parser.getAST(); System.out.println(t.toStringTree()); ExprTreeParser treeParser = new ExprTreeParser(); int x = treeParser.expr(t); System.out.println(x); }

16 Exercícios 1. Adicionar a linguagem de expressões o comando print print(4+3*6) 2. Adicionar a linguagem de expressões suporte a varáveis v1 = 3+5 print(v1+10) *Não tente fazer os dois ao mesmo tempo

17 ANTLR ANother Tool for Language Recognition www.antlr.org Jobson Ronan (jrjs) Renato Viana (rvf)


Carregar ppt "ANTLR ANother Tool for Language Recognition www.antlr.org Jobson Ronan (jrjs) Renato Viana (rvf)"

Apresentações semelhantes


Anúncios Google