ANTLR

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

description

ANTLR. ANother Tool for Language Recognition www.antlr.org Jobson Ronan (jrjs) Renato Viana (rvf). Motivação. Parsers criados com YACC tendem a ter baixa qualidade de mensagens de erro - PowerPoint PPT Presentation

Transcript of ANTLR

Page 1: ANTLR

ANTLR

ANother Tool for Language Recognitionwww.antlr.org

Jobson Ronan (jrjs)Renato Viana (rvf)

Page 2: ANTLR

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

Page 3: ANTLR

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.

Page 4: ANTLR

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)

Page 5: ANTLR

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

EBNFclass ExprParser extends Parser;

expr: mexpr ((PLUS|MINUS) mexpr)* ;

mexpr : atom (STAR atom)* ;

atom: INT | LPAREN expr RPAREN ;

Page 6: ANTLR

Lexerclass 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);} ;

Page 7: ANTLR

Gerando

Executar ferramenta de geração$ java antlr.Tool expr.g

ResultadoExprLexer.java

ExprParser.java

ExprParserTokenTypes.java

Page 8: ANTLR

Testando

Executar o parserimport 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(); }}

Page 9: ANTLR

Avaliando Expressões

Avaliando expressões on-the-flyclass 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 ;

Page 10: ANTLR

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); }}

Page 11: ANTLR

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

Page 12: ANTLR

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

Page 13: ANTLR

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! ;

Page 14: ANTLR

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

Page 15: ANTLR

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); } }

Page 16: ANTLR

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áveisv1 = 3+5print(v1+10)

*Não tente fazer os dois ao mesmo tempo

Page 17: ANTLR

ANTLR

ANother Tool for Language Recognitionwww.antlr.org

Jobson Ronan (jrjs)Renato Viana (rvf)