f-22 0 Denunciar mensagem Publicado 25 de Janeiro de 2013 Boas pessoal, Estou a implementar um parser em flex e bison mas estou com 1 problema. A minha questão creio não ser dificil mas é complicada de explicar por escrito. Se houver alguém disponível para me tentar ajudar via skype diga sff. O meu problema não é na definição da gramática nem erros típicos do flex ou bison é um problema lógico. Obrigado Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
thoga31 610 Denunciar mensagem Publicado 25 de Janeiro de 2013 No P@P preza-se a entreajuda em público e não por meios privados. Coloca aqui a tua dúvida. Knowledge is free! Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
f-22 0 Denunciar mensagem Publicado 28 de Janeiro de 2013 (editado) Boas, thoga31thoga31, tens toda a razão, isto é uma comunidade, mas realmente não sabia explicar o meu problema, a intenção era falar com alguem explicar o problema e depois postar aqui o problema e a solução. Entre tanto já consegui resolver o problema que não conseguia explicar. Tinha a ver com a ordem com que o bison estava a imprimir as coisas no ecrã. Mas já consegui dar a volta. Actualmente tenho um problema de definição da gramática. Simplifiquei o problema. FLEX: "b" { strcpy(yylval.string, yytext); return VAR_B; } "a" { strcpy(yylval.string, yytext); return VAR_A; } \r\n { return EOL; } . BISON: %token <string> VAR_B %token <string> VAR_A %token EOL %% input: { } | input linha { } ; linha: EOL { } | aas bbs EOL { printf("\n"); } ; bbs: VAR_B { printf("B"); } ; aas: VAR_A { printf("A"); } | aas VAR_A { } ; O problema é que esta gramática deveria aceitar o input abaixo, mas não aceita, dá erro. a a b Se eu apagar o "bbs" da "linha" e apagar do input o b, o ficheiro mostra correctamente as 2 linhas com os "a". Mas com o b não. Conseguem ajudar-me? Obrigado -- editei para simplificar ainda mais o problema. Editado 28 de Janeiro de 2013 por f-22 Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
Rui Carlos 348 Denunciar mensagem Publicado 29 de Janeiro de 2013 De acordo com essa gramática, uma linha ou está vazia, ou tem uma sequência de um ou mais "a" terminando com um "b" (é isto que diz na produção linha). Rui Carlos Gonçalves Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
f-22 0 Denunciar mensagem Publicado 29 de Janeiro de 2013 (editado) o pretendido era ter uma gramática que validasse que o "b" tinha obrigatoriamente vir a seguir do "a" ou dos vários "a". Já fiz vários testes mas não consigo implementar isso, dá sempre syntax erro. Fará sentido por essa validação na gramática ou tenho de fazer essa validação com funções de C, pôr exemplo criar 1 função que assinale a leitura de "b" e ver se existiu 1 leitura de "a" ou vários antes? Mas faz-me sentido que seja ao nível da gramática. Se tiver de ser através de funções, eu sei resolver da forma como descrevi. Segue abaixo a tentativa de resolução com a gramática, que também não funciona. O flex é = ao que já tinha postado BISON input: { } | input linha { } ; linha: aas eols bbs { printf("\n"); } ; bbs: VAR_B { printf("B"); } ; aas: VAR_A { printf("A"); } | aas VAR_A { } ; eols: EOL | eols EOL ; Editado 29 de Janeiro de 2013 por f-22 Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
Rui Carlos 348 Denunciar mensagem Publicado 29 de Janeiro de 2013 Experimenta algo deste género: input : aas b ; aas : VAR_A eol | VAR_A eol aas ; b : VAR_B ; eol : | EOL eol ; Tens os "a"s e um "b". Depois de um "a" podes ter quantos EOL quiseres (incluindo 0). 1 Rui Carlos Gonçalves Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
f-22 0 Denunciar mensagem Publicado 29 de Janeiro de 2013 Funciona Rui Carlos, muito obrigado. Alterei ligeiramente a tua gramática (nada de mais) para permitir espaços antes dos "a"s e depois do "b", funciona perfeitamente. Fica aqui a solução final da gramática para aceitar espaços depois 1 ou vários "a"s e depois obrigatoriamente 1 "b". input : eol aas b eol ; aas : VAR_A eol { printf("A"); } | VAR_A eol aas { printf("A"); } ; b : VAR_B { printf("B"); } ; eol : | EOL eol ; Entre tanto, só para clarificar, este tipo de necessidades resolve-se na gramática certo? não se recorre a soluções como descrevia a pouco, ou seja, funções que assinalam que ja se leu o A e agora pode-se aceitar "b"s. Mais uma vez, obrigado Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
Rui Carlos 348 Denunciar mensagem Publicado 29 de Janeiro de 2013 Aquilo que falaste passava por criar um autómato dentro de... outro autómato. Não há qualquer necessidade de fazer isso. A única coisa que não me agrada aí, é a produção do eol (que eu também usei), que devia passar para o analisador léxico. Mas já não mexo em flex/bison há muitos anos, pelo que não sei exactamente qual o melhor método para fazer isso. 1 Rui Carlos Gonçalves Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
f-22 0 Denunciar mensagem Publicado 29 de Janeiro de 2013 Aquilo que falaste passava por criar um autómato dentro de... outro autómato. Não há qualquer necessidade de fazer isso. A única coisa que não me agrada aí, é a produção do eol (que eu também usei), que devia passar para o analisador léxico. Mas já não mexo em flex/bison há muitos anos, pelo que não sei exactamente qual o melhor método para fazer isso. Ok, muito obrigado. No meu caso especifico penso que a solução do "eol" está bem, porque quero analisar 1 linguagem, ou seja no flex o que tenho são keywords da minha linguagem e o bison é que tem de fazer a "magia". Neste caso o que te estavas a referir seria na regex do flex pôr algo do genero "\r\n*a\r\n*" e o "b". Obrigado Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
Rui Carlos 348 Denunciar mensagem Publicado 29 de Janeiro de 2013 Não, no flex devia ficar algo do género \n+ associado ao EOL. (O resto parece-me aceitável estar no bison, apesar de teres uma linguagem regular, que não precisava de gramáticas para nada.) Rui Carlos Gonçalves Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites