Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
ANTLR ANother Tool for Language Recognition www.antlr.org Jobson Ronan (jrjs) Renato Viana (rvf)
Motivação <ul><li>Parsers  criados com YACC tendem a ter baixa qualidade de mensagens de erro </li></ul><ul><li>Erros em g...
Características <ul><li>ANTLR gera  recursive decent   parsers  e possui uma boa reportagem de erros. </li></ul><ul><li>Pa...
Aprendendo por exemplo <ul><li>Exp: Linguagem de expressões aritméticas </li></ul><ul><ul><li>Suporta soma, subtração e mu...
Gramática <ul><li>Todas as gramáticas do ANTLR são subclasses de Lexer, Parser, or TreeParser </li></ul><ul><ul><li>As reg...
Lexer class ExprLexer extends Lexer; options { k=2; // needed for newline junk charVocabulary='u0000'..'u007F'; // allow a...
Gerando <ul><li>Executar ferramenta de geração </li></ul><ul><ul><li>$ java antlr.Tool expr.g </li></ul></ul><ul><li>Resul...
Testando <ul><li>Executar o parser </li></ul>import antlr.*; public class Main { public static void main(String[] args) th...
Avaliando Expressões <ul><li>Avaliando expressões  on-the-fly </li></ul>class ExprParser extends Parser; expr returns [int...
Testando <ul><li>Alterações no método expr() </li></ul>import antlr.*; public class Main { public static void main(String[...
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...
Gerando ASTs <ul><li>Pequenas alterações na definição da gramática </li></ul><ul><ul><li>Indica-se açucares sintáticos </l...
Alterações na gramática <ul><li>“ ^” Índica as raízes das sub-arvores </li></ul><ul><li>“ !” Índica os açucares sintáticos...
Definindo TreeParser class ExprTreeParser extends TreeParser; options { importVocab=ExprParser; } expr returns [int r=0] {...
Testando import antlr.*; import antlr.collections.*; public class Main { public static void main(String[] args) throws Exc...
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></...
ANTLR ANother Tool for Language Recognition www.antlr.org Jobson Ronan (jrjs) Renato Viana (rvf)
Upcoming SlideShare
Loading in …5
×

ANTLR-ANother Tool for Language Recognition

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all
  • Be the first to comment

  • Be the first to like this

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)

×