Jump to content
f-22

Parser em bison, problema lógico

Recommended Posts

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

Share this post


Link to post
Share on other sites
thoga31

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!

Share this post


Link to post
Share on other 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.

Edited by f-22

Share this post


Link to post
Share on other 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
;

Edited by f-22

Share this post


Link to post
Share on other 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).

  • Vote 1

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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.

  • Vote 1

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other sites
Rui Carlos

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.