Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Nazgulled

Alguém percebe alguma coisa de flex/lex (analisador léxico)?

Mensagens Recomendadas

Nazgulled

Pergunto isto andes de colocar as minhas dúvidas porque caso não haja ninguém com conhecimentos no assunto, escuso de perder tempo a descrever detalhadamente essas dúvidas...

Será que alguém me vai puder ajudar nisto ou vou ter de me desenrascar sozinho?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Nazgulled

E meter logo as dúvidas?

Como eu disse, isto não me pareceu ser algo que muita gente tivesse conhecimentos... Mal consigo encontrar informação relevante no Google, apenas manuais que já os li de trás para a frente e não me consigo desenrascar. Não ia perder tempo a detalhar as dúvidas para depois não ter respostas... Time is precious.

O meu trabalho consiste (tem vários mas eu escolhi este) em criar uma espécie de syntax tipo wiki (ou como nos quisermos) e depois exportar para HTML e LaTeX (definindo no próprio documento o tipo de ficheiro a exportar, mas isso é irrelevante).

Por exemplo:

**negrito**

negrito

//itálico//

itálico

__sublinhado__

sublinhado

Esta parte é fácil e não custa nada, o problema está em quando estas coisas são misturadas, exemplo:

**Esta frase a negrito também tem //palavras em itálico// e ainda __algumas sublinhadas__ e ainda //__palavras em itálico e sublinhado__//**

Esta frase a negrito tem também tem palavras em itálico e ainda algumas sublinhadas e ainda palavras em itálico e sublinhado

Não estou a conseguir fazer isto... Talvez me conseguisse desenrascar se a ordem não mudasse e fosse sempre a mesma, mas mudando, não estou a ver como fazer. Por exemplo, refiro-me a ter o exemplo acima, mas agora assim:

//Esta frase em itálico também tem **palavras a negrito** e ainda __algumas sublinhadas__ e ainda **__palavras a negrito e sublinhado__**//

Esta frase em itálico tem também tem palavras a negrito e ainda algumas sublinhadas e ainda palavras a negrito e sublinhado

Pode ser qualquer uma destas situações ou outra completamente diferente...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Rui Carlos

Penso que isto tem mais a ver com definições de gramáticas do que com Lex...

Penso que a parte mais complicada deve ser criar uma gramática que suporte essas combinações todas.

Algo deste género deve servir:

FTXT -> STR    // um texto formatado pode ser apenas uma string sem formatação

    | FTXT ** FTXT ** STR    // pode ser um texto formatado em que a formatação mais à direita é o **

    | FTXT __ FTXT __ STR    // pode ser um texto formatado em que a formatação mais à direita é o __

    | FTXT // FTXT // STR    // ...

    |    // pode ser vazio

STR  -> ...    // uma string sem formatação é ...

Depois no parsing é só fazer substituições.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Baderous

Tens de criar condições de contexto que representem cada um desses estados possíveis (negrito, itálico e sublinhado). Quando apanhas o identificador de um estado (o ** por exemplo), entras nesse estado, e tudo o que apanhares aí dentro até encontrares novamente o ** é escrito a negrito. Se dentro desse estado encontrares um identificador para outro estado, por exemplo, o __ , entras no estado sublinhado e fazes o mesmo.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Nazgulled

Tens de criar condições de contexto que representem cada um desses estados possíveis (negrito, itálico e sublinhado). Quando apanhas o identificador de um estado (o ** por exemplo), entras nesse estado, e tudo o que apanhares aí dentro até encontrares novamente o ** é escrito a negrito. Se dentro desse estado encontrares um identificador para outro estado, por exemplo, o __ , entras no estado sublinhado e fazes o mesmo.

Isso eu já tentei fazer, mas não apanhava todas as combinações possíveis...

@Rui Carlos

Não percebi lá muito o que descreveste...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Rui Carlos

Tens de criar condições de contexto que representem cada um desses estados possíveis (negrito, itálico e sublinhado). Quando apanhas o identificador de um estado (o ** por exemplo), entras nesse estado, e tudo o que apanhares aí dentro até encontrares novamente o ** é escrito a negrito. Se dentro desse estado encontrares um identificador para outro estado, por exemplo, o __ , entras no estado sublinhado e fazes o mesmo.

Parece-me que isso seria mais a estratégia a seguir usando autómatos (expressões regulares), e não usando gramáticas. Usando gramáticas (e o Lex para gerar o parser), pelo menos neste caso, não precisas de te preocupares com essas coisas. Acho que é só mesmo fazer substituições.


Nazgulled:

Qual a parte que não percebestes?

Percebes de gramáticas?

Percebes a notação BNF?

Ou o problema é depois passar a gramática para Lex?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Nazgulled

Eu acho que estas a falar de coisas que ainda não foram ensinadas...

Este trabalho é suposto ser simples e rápido de fazer (palavras do professor) e a ideia é usar somente o Flex e escrever algumas expressões regulares, usar estados onde for preciso e pouco mais.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Rui Carlos

Esquece, estava a confundir o Lex com o Yacc. Realmente com o Lex não podes usar gramáticas.

Já experimentaste apenas fazer um find/replace de **,//,__ por <b>,<i>,<u>?

Esta abordagem tem um problema, que é não validar o input, que não sei se também é suposto fazeres.

Validar o input pode ser bastante complicado, principalmente se permitires aninhamentos de marcadores do mesmo tipo (itálicos dentro de itálicos). Se não permitires isso, podes verificar se os marcadores estão correctamente aninhados com um stack (quando detectas a abertura de um marcador, colocás-lo na stack, e quando detectas o fecho, removes-lo da stack, ou se não for o mesmo marcador, o texto está mal formatado).

A solução do autómato também é possível, mas, no meu entender, complica mais as coisas, devido à combinações possíveis (embora possa ser um conceito mais fácil de entender, pois já estás mais habituado a ele).

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Triton

Tens várias abordagens a seguir, mas depende se precisas de validar ou não o input, como já disseram. Se bem me lembro podes fazer algo como um PUSH STATE e POP STATE no lex, assim conseguias saber em que estado estás (sublinhado/negrito/itálico). Isso é normalmente usado em exemplos de fazer parse de comentários encadeados, tipo isto:

"/* comment /* outro comment */ fim do comment*/


<3 life

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Nazgulled

Já experimentaste apenas fazer um find/replace de **,//,__ por <b>,<i>,<u>?

Isso já fiz... Aliás, por um lado eu já tenho o trabalho todo feito. Tudo aquilo que pede no enunciado (que é bastante sucinto) eu já fiz, mas na minha opinião o trabalho está uma valente cagada. Se calhar sou eu que desenvolvo páginas aos anos e já tenho alguns conhecimentos em HTML que me fazem pensar assim, mas eu não gosto nada do trabalho que fiz e aquilo que fiz parece-me demasiado simples...

Já decidi que ia mandar um mail ao prof com o trabalho para ele me dar a opinião dele e logo vejo o que fazer... Mas o mais provável é eu pegar noutro trabalho (como disse, existem vários e temos de escolher um) e fazer bem feito.

Quanto ao valida ao input, lá está... Isso não é pedido no enunciado, nem tão pouco mencionado mas é daquelas coisas que para mim não faz sentido não ter. Só que visto por outro prisma, este tipo de coisas não faz parte do âmbito da cadeira e o prof sempre disse que este trabalho é coisa para se fazer numas horas, o próximo é que será trabalho a sério.

Mas já agora, deixo aqui o enunciado...

Desenvolver um documento em LATEX ou mesmo em HTML ´e uma actividade inteligente e intelectualmente interessante

enquanto estruturante das ideias e sistematizante dos processos. Por´em o acto de editar o respectivo documento ´e por

vezes fastidioso devido ao peso das marcas (as tags) que tem de ser inseridas para anotar o texto com indica¸c˜oes de

forma, conte´udo ou formato.

Por isso apareceram editores sens´ıveis ao contexto que sabendo que se est´a a escrever um documento LATEX ou HTML

nos facilitam a vida inserindo as ditas marcas, ou anota¸c˜oes. Uma alternativa mais simples mas tamb´em muito usada ´e permitir o uso de anota¸c˜oes mais leves e simples (at´e de preferˆencia independentes do tipo de documento final) e de

pois recorrer ao pr´e-processamento para substituir essa nota¸c˜ao ligeira, abreviada, pelas marcas finais correctas.

Este ´e o caso do conhecido PPP3, desenvolvido h´a alguns anos por Jos´e Carlos Ramalho, ou mesmo do mais actual e

n˜ao menos conhecido sistema Wiki para constru¸c˜ao interactiva e via web de p´aginas HTML.

O que se lhe pede neste trabalho ´e que, depois de investigar os tais pr´e-processadores PPP e Wiki, especifique uma sua

linguagem de anota¸c˜ao para abreviar a escrita de formata¸c˜ao (negrito, it´alico, sublinhado, v´arios n´ıveis de t´ıtulos) e

listas de t´opicos (items) n˜ao-numerados, numerados ou tipo entradas de um dicion´ario. Deve, depois, criar, com

a ferramenta Flex, um processador que transforme a sua nota¸c˜ao em LATEX ou HTML4.

Nota: Fiz copy/paste, não me batam pela formatação...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Baderous

Quanto ao valida ao input, lá está... Isso não é pedido no enunciado, nem tão pouco mencionado mas é daquelas coisas que para mim não faz sentido não ter. Só que visto por outro prisma, este tipo de coisas não faz parte do âmbito da cadeira e o prof sempre disse que este trabalho é coisa para se fazer numas horas, o próximo é que será trabalho a sério.

Não é assim tão fora do âmbito como pensas, no ano passado um dos exercícios iniciais consistia em verificar se um ficheiro XML estava bem construído com auxílio de uma stack.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
20_LESI

Também estou com problemas neste trabalho. Eu optei por um tema diferente do do Nazgulled, em que temos de guardar informação numa estrutura de dados e depois gerar um ficheiro HTML com essa informação. Estou a ter bastantes dificuldades com as expressões regulares, nomeadamente com os estados. Não consigo criar um estado com mais do que uma ER. Por exemplo:

<CHAVE>[ \{ ]*

<CHAVE>[^,]+

Entra-me sempre no caso de baixo. No entanto, se escrever:

<OXIL>[ \{ ]*  { BEGIN CHAVE; }

<CHAVE>[^,]

Isto já faz o esperado. Alguém me sabe dizer o que estou a fazer mal?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Nazgulled

Uma dúvida diferente...

Quem puder, que abra o seguinte ficheiro:

http://www.di.uminho.pt/~prh/pl09tp1.pdf

Veja o enunciado 1, alínea c. A minha questão é mais propriamente na parte de "uma ferramenta de procura do Linux possa fazer a pesquisa". Como é que uma ferramenta de procura do linux vai fazer a pesquisa usando o meu código em flex?

Imaginado que eu já programei tudo em flex para criar uma pseudo base de dados para guardar os autores e tal e ainda uma função de lookup dentro do mesmo ficheiro. Que função de programar do linux se pode usar para fazer a pesquisa usando o meu código (a minha função de lookup) e como é que isso vai funcionar?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Nazgulled

Ninguém sabe?

Precisava mesmo de saber fazer isto. Já só falta 72h para a data de entrega e eu ainda não comecei o trabalho, dava jeito saber como fazer isso. Dicas?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Nazgulled

Tu tas a dizer que a minha aplicação será o comando de linux que faz as pesquisas em determinado ficheiro... Ok, isso não é difícil. Mas eu percebo que é algum comando externo que vai comunicar com a minha aplicação, de alguma forma, e fazer assim a pesquisa. Por isso é que estou na dúvida...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.