Parser LexML
-
Upload
olivia-hyde -
Category
Documents
-
view
103 -
download
0
description
Transcript of Parser LexML
![Page 1: Parser LexML](https://reader033.fdocumentos.tips/reader033/viewer/2022061501/56813777550346895d9f0ed9/html5/thumbnails/1.jpg)
Parser LexML
João Lima
![Page 2: Parser LexML](https://reader033.fdocumentos.tips/reader033/viewer/2022061501/56813777550346895d9f0ed9/html5/thumbnails/2.jpg)
Tópicos
Parser Aplicações Tipos
Ferramentas ANTLR Implementação Próximos passos
![Page 3: Parser LexML](https://reader033.fdocumentos.tips/reader033/viewer/2022061501/56813777550346895d9f0ed9/html5/thumbnails/3.jpg)
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
![Page 4: Parser LexML](https://reader033.fdocumentos.tips/reader033/viewer/2022061501/56813777550346895d9f0ed9/html5/thumbnails/4.jpg)
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)
![Page 5: Parser LexML](https://reader033.fdocumentos.tips/reader033/viewer/2022061501/56813777550346895d9f0ed9/html5/thumbnails/5.jpg)
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
![Page 6: Parser LexML](https://reader033.fdocumentos.tips/reader033/viewer/2022061501/56813777550346895d9f0ed9/html5/thumbnails/6.jpg)
Etapas básicas
Lexer
Parser
caracteres
tokens
Árvore sintática
Tabelade
Símbolos
![Page 7: Parser LexML](https://reader033.fdocumentos.tips/reader033/viewer/2022061501/56813777550346895d9f0ed9/html5/thumbnails/7.jpg)
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
![Page 8: Parser LexML](https://reader033.fdocumentos.tips/reader033/viewer/2022061501/56813777550346895d9f0ed9/html5/thumbnails/8.jpg)
ANTLR Website: www.antlr.org
![Page 9: Parser LexML](https://reader033.fdocumentos.tips/reader033/viewer/2022061501/56813777550346895d9f0ed9/html5/thumbnails/9.jpg)
Etapas (ANTLR)
Lexer
Parser
caracteres
tokens Tabelade
Símbolos
P(Tree)
AST
Saída(XML)
![Page 10: Parser LexML](https://reader033.fdocumentos.tips/reader033/viewer/2022061501/56813777550346895d9f0ed9/html5/thumbnails/10.jpg)
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”
![Page 11: Parser LexML](https://reader033.fdocumentos.tips/reader033/viewer/2022061501/56813777550346895d9f0ed9/html5/thumbnails/11.jpg)
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
![Page 12: Parser LexML](https://reader033.fdocumentos.tips/reader033/viewer/2022061501/56813777550346895d9f0ed9/html5/thumbnails/12.jpg)
Parser LexML (atual)
Normaliza.g Lexer
Parser
GeraXML.g
Lingüístico.gLexML.g
Arq.txtArq_
Normal.txt
Arq_LexML.xml
Arq_LexML
Lang.xml
![Page 13: Parser LexML](https://reader033.fdocumentos.tips/reader033/viewer/2022061501/56813777550346895d9f0ed9/html5/thumbnails/13.jpg)
Arquivo de Entrada
![Page 14: Parser LexML](https://reader033.fdocumentos.tips/reader033/viewer/2022061501/56813777550346895d9f0ed9/html5/thumbnails/14.jpg)
Após Normalização
![Page 15: Parser LexML](https://reader033.fdocumentos.tips/reader033/viewer/2022061501/56813777550346895d9f0ed9/html5/thumbnails/15.jpg)
Após Parser
![Page 16: Parser LexML](https://reader033.fdocumentos.tips/reader033/viewer/2022061501/56813777550346895d9f0ed9/html5/thumbnails/16.jpg)
Normaliza
Trata espaços, tabs, quebras de linhas repetidos
Trata caracteres especiais Ordinal / Grau / “o” sobre-escrito
![Page 17: Parser LexML](https://reader033.fdocumentos.tips/reader033/viewer/2022061501/56813777550346895d9f0ed9/html5/thumbnails/17.jpg)
Normaliza.glexer 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 : .;
fragmentWS : (' '|'\t')+;
![Page 18: Parser LexML](https://reader033.fdocumentos.tips/reader033/viewer/2022061501/56813777550346895d9f0ed9/html5/thumbnails/18.jpg)
Programa “PipeLexML arq.txt”//FASE NORMALIZACAO//arquivo de entradaFileInputStream 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());
![Page 19: Parser LexML](https://reader033.fdocumentos.tips/reader033/viewer/2022061501/56813777550346895d9f0ed9/html5/thumbnails/19.jpg)
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'|'Ç'|'ç'|'Ã'|'ã'|'Â'|'À'|'à'|'â'|'á'|'é'|'í'|'ó'|'ô'|'ú'|'Ü'|'ü'|'Á'|'É'|'Í'|'Ó'|'Ô'|'Ú'|'ê'|'Ê'|'õ'|'Õ'|'\'')+;
![Page 20: Parser LexML](https://reader033.fdocumentos.tips/reader033/viewer/2022061501/56813777550346895d9f0ed9/html5/thumbnails/20.jpg)
LexML Parser - exemplo
![Page 21: Parser LexML](https://reader033.fdocumentos.tips/reader033/viewer/2022061501/56813777550346895d9f0ed9/html5/thumbnails/21.jpg)
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");
![Page 22: Parser LexML](https://reader033.fdocumentos.tips/reader033/viewer/2022061501/56813777550346895d9f0ed9/html5/thumbnails/22.jpg)
Linguistico.g
lexer grammar Linguistico;options { filter=true;}
//{System.err.println(" Achei "+getText() );}
LinguaLa : // latin (' '|','|';'|'.'|'(') 'caput' (' '|','|';'|'.'|')') {setText(getText().substring(0, 1)+"<span lang=\"la\">"+getText().substring(1, getText().length() -1)+"</span>"+getText().substring(getText().length()-1));} ;
LinguaEn : // ingles (' '|','|';'|'.'|'(') 'leasing' (' '|','|';'|'.'|')') {setText(getText().substring(0, 1)+"<span lang=\"en\">"+getText().substring(1, getText().length() -1)+"</span>"+getText().substring(getText().length()-1));} ;
Resto : . ;
![Page 23: Parser LexML](https://reader033.fdocumentos.tips/reader033/viewer/2022061501/56813777550346895d9f0ed9/html5/thumbnails/23.jpg)
Parser LexML(final)
Normaliza.g
Lexer
Parser
GeraXML.g
Lingüístico.g
LexML.g
Ok?
Sim
Lexer
Parser
LexMLFlex.g
NãoGeraXMLF.g
Lexer
Parser
Links.g
![Page 24: Parser LexML](https://reader033.fdocumentos.tips/reader033/viewer/2022061501/56813777550346895d9f0ed9/html5/thumbnails/24.jpg)
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