Carregar apresentação
A apresentação está carregando. Por favor, espere
PublicouTiago Luiz Fernando de Miranda Graça Alterado mais de 8 anos atrás
1
Parser LexML João Lima
2
Tópicos Parser Aplicações Tipos Ferramentas ANTLR Implementação Próximos passos
3
Parser - Aplicações Filtros Traduz uma entrada em uma saída sem considerar uma gramática Validadores Verifica se uma entrada obedece a uma gramática Processadores Valida e Processa (sem re-escrita) Ações: cálculos, atualizar banco de dados, etc. Tradutores Valida e Traduz a entrada em outro formato
4
Parser - Tipos LL(k) Top-down parser Left-to-right Derivação à esquerda (da entrada) Impossibilita regras com recursividade à esquerda Mais fácil para entender e depurar LR(k) Bottom-up parser Left-to-right Derivação à direita (da entrada)
5
Ferramentas Qual ferramenta utilizar? Perl, awk? Tradução léxica (não gramatical) Lexer/Parser YACC/Bison, Lex, GOLD, Grammatica, Spirit ANTLR ANother Tool for Language Recognition
6
Etapas básicas Lexer Parser caracteres tokens Árvore sintática Tabela de Símbolos
7
ANTLR v. 3.0.1 Código aberto - Licença BSD LL(*) extensão LL(k) Predicados semânticos e sintáticos Memoized Backtracking Otimiza a performance do lookahead Unicode Lexer Hierárquico Regras hierarquizadas Target Languages Java, C, C++, C#, Objective-C, Ruby, Python EBNF Sintaxe mais concisa que BNF AST Abstract Syntax Tree Tipos adicionais de Gramática Tree Grammar Lexer Grammar (filtro=true) ANTLRWorks IDE para criação de gramáticas Syntax Diagram Error Detection
8
ANTLR Website: www.antlr.org
9
Etapas (ANTLR) Lexer Parser caracteres tokens Tabela de Símbolos P(Tree) AST Saída (XML)
10
ANTLR – como codificar e executar Codifica gramática utilizando a IDE (ANTLRWorks) Gera código na linguagem destino (Java) Normaliza.g LexML.g GeraXML.g Linguistico.g Cria programa para efetuar as chamadas aos parser PipeLexML.java Funções estáticas auxiliares UtilLexml Executa “PipeLexML lei8112.txt”
11
Passos java -ms64m -mx1G org.antlr.Tool Normaliza.g java -ms64m -mx1G org.antlr.Tool LexML.g java -ms64m -mx1G org.antlr.Tool GeraXML.g java -ms64m -mx1G org.antlr.Tool Linguistico.g javac *.java java PipeLexML %1
12
Parser LexML (atual) Normaliza.gLexer Parser GeraXML.g Lingüístico.g LexML.g Arq.txt Arq_ Normal.txt Arq_ LexML.xml Arq_ LexML Lang.xml
13
Arquivo de Entrada
14
Após Normalização
15
Após Parser
16
Normaliza Trata espaços, tabs, quebras de linhas repetidos Trata caracteres especiais Ordinal / Grau / “o” sobre-escrito
17
Normaliza.g lexer grammar Normaliza; options { filter=true; } WSinterno : (' '|'\t')(' '|'\t')+ {setText(" ");}; Normaliza : ( WS* '\r'? '\n' )+ WS* // normaliza final(is) de linha(s) {setText("\r\n");} | ('\t') // troca tab por branco {setText(" ");} | ('\u0096') // troca travessao pequeno por hifen {setText("-");} | ('0'..'9') ('o'|'°') (' '|','|';'|'.') // acerta ordinal 9o {String termo = getText(); setText(termo.substring(0, 1)+"º"+termo.substring(2));} ; Resto :.; fragment WS : (' '|'\t')+;
18
Programa “PipeLexML arq.txt” //FASE NORMALIZACAO //arquivo de entrada FileInputStream fstream = new FileInputStream(args[0]); // Filtro de Normalização ANTLRInputStream input = new ANTLRInputStream(fstream); NormalizaLexer lexFiltro = new NormalizaLexer(input); TokenStream tokensFiltro = new CommonTokenStream(lexFiltro); System.err.println("Fase Normalização - OK"); System.setOut(new PrintStream(new FileOutputStream(args[0]+"_Normal.txt"))); System.out.println(tokensFiltro.toString());
19
LexMLLexer - exemplo TITULOROT: {getCharPositionInLine()==0}? ('Título'|'TÍTULO') | ('Título'|'TÍTULO') {$type = PALAVRA;} ; CAPITULOROT: {getCharPositionInLine()==0}? ('Capítulo'|'CAPÍTULO') | ('Capítulo'|'CAPÍTULO') {$type = PALAVRA;} ; SECAOROT: {getCharPositionInLine()==0}? ('Seção'|'SEÇÃO') | ('Seção'|'SEÇÃO') {$type = PALAVRA;} ; SUBSECAOROT: {getCharPositionInLine()==0}? ('Subseção'|'SUBSEÇÃO') | ('Subseção'|'SUBSEÇÃO') {$type = PALAVRA;} ; PARTEROT: {getCharPositionInLine()==0}? ('Parte'|'PARTE') | ('Parte'|'PARTE') {$type = PALAVRA;} ; PALAVRA: ('a'..'z'|'A'..'Z'|'Ç'|'ç'|'Ã'|'ã'|'Â'|'À'|'à'|'â'|'á'|'é'|'í'|'ó'|'ô'|'ú'|'Ü' |'ü'|'Á'|'É'|'Í'|'Ó'|'Ô'|'Ú'|'ê'|'Ê'|'õ'|'Õ'|'\'')+;
20
LexML Parser - exemplo
21
LexMLLexer e Parser // Parser do Texto Normalizado e criação de Árvore em Memória LexMLLexer lexer = new LexMLLexer(new ANTLRStringStream(tokensFiltro.toString())); TokenRewriteStream tokens = new TokenRewriteStream(lexer); LexMLParser parser = new LexMLParser(tokens); LexMLParser.lexml_return r = parser.lexml(); System.err.println("Fase Parser - OK"); // arquivo de saída (básico) System.setOut(new PrintStream(new FileOutputStream(args[0]+"_LexML.xml"), true, "UTF-8")); // Passeio na árvore, externalizando o XML CommonTree t = (CommonTree)r.getTree(); CommonTreeNodeStream nodes = new CommonTreeNodeStream(t); nodes.setTokenStream(tokens); GeraXML walker = new GeraXML(nodes); // cria a árvore Walker GeraXML.lexml_return r2 = walker.lexml(); System.err.println("Fase Geração do LexXML - OK");
22
Linguistico.g lexer grammar Linguistico; options { filter=true; } //{System.err.println(" Achei "+getText() );} LinguaLa : // latin (' '|','|';'|'.'|'(') 'caput' (' '|','|';'|'.'|')') {setText(getText().substring(0, 1)+" "+getText().substring(1, getText().length() -1)+" "+getText().substring(getText().length()-1));} ; LinguaEn : // ingles (' '|','|';'|'.'|'(') 'leasing' (' '|','|';'|'.'|')') {setText(getText().substring(0, 1)+" "+getText().substring(1, getText().length() -1)+" "+getText().substring(getText().length()-1));} ; Resto :. ;
23
Parser LexML (final) Normaliza.g Lexer Parser GeraXML.g Lingüístico.g LexML.g Ok? Sim Lexer Parser LexMLFlex.g Não GeraXMLF.g Lexer Parser Links.g
24
Próximos passos Considerar Alteração de Norma Reconhecer entrada html Analisador de Remissões LexML Flexível Parser Decisão Monocrática, Acórdãos Parser Semântico
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.