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

f-22

Parser em bison, problema lógico

Mensagens Recomendadas

f-22

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
f-22

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 por f-22

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
f-22

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 por f-22

Partilhar esta mensagem


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

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).

  • Voto 1

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
f-22

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

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.

  • Voto 1

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
f-22

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

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.