parser lexml
DESCRIPTION
Parser LexML. João Lima. Tópicos. Parser Aplicações Tipos Ferramentas ANTLR Implementação Próximos passos. 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 - PowerPoint PPT PresentationTRANSCRIPT
Parser LexML
João Lima
Tópicos
Parser Aplicações Tipos
Ferramentas ANTLR Implementação Próximos passos
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
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)
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
Etapas básicas
Lexer
Parser
caracteres
tokens
Árvore sintática
Tabelade
Símbolos
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
ANTLR Website: www.antlr.org
Etapas (ANTLR)
Lexer
Parser
caracteres
tokens Tabelade
Símbolos
P(Tree)
AST
Saída(XML)
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”
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
Parser LexML (atual)
Normaliza.g Lexer
Parser
GeraXML.g
Lingüístico.gLexML.g
Arq.txtArq_
Normal.txt
Arq_LexML.xml
Arq_LexML
Lang.xml
Arquivo de Entrada
Após Normalização
Após Parser
Normaliza
Trata espaços, tabs, quebras de linhas repetidos
Trata caracteres especiais Ordinal / Grau / “o” sobre-escrito
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')+;
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());
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'|'Ç'|'ç'|'Ã'|'ã'|'Â'|'À'|'à'|'â'|'á'|'é'|'í'|'ó'|'ô'|'ú'|'Ü'|'ü'|'Á'|'É'|'Í'|'Ó'|'Ô'|'Ú'|'ê'|'Ê'|'õ'|'Õ'|'\'')+;
LexML Parser - exemplo
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");
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 : . ;
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
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