ANTLR-ANother Tool for Language Recognition

2,419 views

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
2,419
On SlideShare
0
From Embeds
0
Number of Embeds
9
Actions
Shares
0
Downloads
38
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

ANTLR-ANother Tool for Language Recognition

  1. 1. ANTLR ANother Tool for Language Recognition www.antlr.org Jobson Ronan (jrjs) Renato Viana (rvf)
  2. 2. Motivação <ul><li>Parsers criados com YACC tendem a ter baixa qualidade de mensagens de erro </li></ul><ul><li>Erros em gramáticas do YACC são difíceis de entender. YACC informa um erro de &quot;shift/reduce&quot; ou &quot;reduce/reduce&quot; associado a uma dada regra da gramática </li></ul><ul><li>Possibilidade de gerar Parsers para várias linguagens (C++, Java, C# e Python) </li></ul><ul><li>Open-source </li></ul>
  3. 3. Características <ul><li>ANTLR gera recursive decent parsers e possui uma boa reportagem de erros. </li></ul><ul><li>Parsers gerados pelo ANTLR são razoavelmente legíveis. Facilitando a depuração </li></ul><ul><li>Possui boa documentação e grande quantidade de exemplos </li></ul><ul><ul><li>Apesar disso, a curva de aprendizagem ainda é grande. </li></ul></ul>
  4. 4. Aprendendo por exemplo <ul><li>Exp: Linguagem de expressões aritméticas </li></ul><ul><ul><li>Suporta soma, subtração e multiplicação de inteiros </li></ul></ul><ul><ul><li>Suporta parêntesis para definir prioridades </li></ul></ul><ul><li>Ex: </li></ul><ul><ul><li>2+3 </li></ul></ul><ul><ul><li>1 </li></ul></ul><ul><ul><li>5*(3+7) </li></ul></ul>
  5. 5. Gramática <ul><li>Todas as gramáticas do ANTLR são subclasses de Lexer, Parser, or TreeParser </li></ul><ul><ul><li>As regras são específicadas em uma notação EBNF </li></ul></ul>class ExprParser extends Parser; expr: mexpr ((PLUS|MINUS) mexpr)* ; mexpr : atom (STAR atom)* ; atom: INT | LPAREN expr RPAREN ;
  6. 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 : ( ' ' | ' ' ' ' | ' ' | ' ' ) {$setType(Token.SKIP);} ;
  7. 7. Gerando <ul><li>Executar ferramenta de geração </li></ul><ul><ul><li>$ java antlr.Tool expr.g </li></ul></ul><ul><li>Resultado </li></ul><ul><ul><li>ExprLexer.java </li></ul></ul><ul><ul><li>ExprParser.java </li></ul></ul><ul><ul><li>ExprParserTokenTypes.java </li></ul></ul>
  8. 8. Testando <ul><li>Executar o parser </li></ul>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. 9. Avaliando Expressões <ul><li>Avaliando expressões on-the-fly </li></ul>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. 10. Testando <ul><li>Alterações no método expr() </li></ul>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. 11. Problemas <ul><li>Mistura de interesses </li></ul><ul><ul><li>Código de definição da gramática </li></ul></ul><ul><ul><li>Código de definição das ações </li></ul></ul><ul><ul><li>Código da linguagem alvo (Java) </li></ul></ul><ul><li>Solução </li></ul><ul><ul><li>Gerar uma AST </li></ul></ul>
  12. 12. Gerando ASTs <ul><li>Pequenas alterações na definição da gramática </li></ul><ul><ul><li>Indica-se açucares sintáticos </li></ul></ul><ul><ul><li>Indica-se nomes dos nós </li></ul></ul><ul><li>Define-se um TreeParser </li></ul>
  13. 13. Alterações na gramática <ul><li>“ ^” Índica as raízes das sub-arvores </li></ul><ul><li>“ !” Índica os açucares sintáticos </li></ul>class ExprParser extends Parser; options { buildAST=true; } expr: mexpr ((PLUS^|MINUS^) mexpr)* ; mexpr : atom (STAR^ atom)* ; atom: INT | LPAREN! expr RPAREN! ;
  14. 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. 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. 16. Exercícios <ul><li>1. Adicionar a linguagem de expressões o comando print </li></ul><ul><ul><li>print(4+3*6) </li></ul></ul><ul><li>2. Adicionar a linguagem de expressões suporte a varáveis </li></ul><ul><ul><li>v1 = 3+5 print(v1+10) </li></ul></ul><ul><li>*Não tente fazer os dois ao mesmo tempo </li></ul>
  17. 17. ANTLR ANother Tool for Language Recognition www.antlr.org Jobson Ronan (jrjs) Renato Viana (rvf)

×