24
Parser LexML João Lima

Parser LexML

Embed Size (px)

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 Presentation

Citation preview

Page 1: Parser LexML

Parser LexML

João Lima

Page 2: Parser LexML

Tópicos

Parser Aplicações Tipos

Ferramentas ANTLR Implementação Próximos passos

Page 3: Parser LexML

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

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

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

Etapas básicas

Lexer

Parser

caracteres

tokens

Árvore sintática

Tabelade

Símbolos

Page 7: Parser LexML

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

ANTLR Website: www.antlr.org

Page 9: Parser LexML

Etapas (ANTLR)

Lexer

Parser

caracteres

tokens Tabelade

Símbolos

P(Tree)

AST

Saída(XML)

Page 10: Parser LexML

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

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

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

Arquivo de Entrada

Page 14: Parser LexML

Após Normalização

Page 15: Parser LexML

Após Parser

Page 16: Parser LexML

Normaliza

Trata espaços, tabs, quebras de linhas repetidos

Trata caracteres especiais Ordinal / Grau / “o” sobre-escrito

Page 17: Parser LexML

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

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

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

LexML Parser - exemplo

Page 21: Parser LexML

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

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

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

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