Jump to content
Umbus

[YACC e LEX] Duvidas

Recommended Posts

Umbus

Tenho algumas duvidas desta linguagem:

Estou com problemas em fazer uma regra para write(""); e writeln(""); com aspas para string ou para expressões sem aspas;

O que tenho e so regras de bison mas nao funciona:

escreve: write opabrir texto opfechar { printf("%d", $3); }
| writeln opabrir texto opfechar { printf("%d/n", $3); }
;

texto: expr
| string
;

string: STRING {$$ = $1}
;

Estou com problemas para fazer o igual := o que tenho é:

Dentro do union tenho char var; depois o token tenho <var> varia finalmente nas regras tenho:

%union {
char var;
}

%token <var> varia

varia op_atribuicao expr { printf("O valor da atribuicao %s e o valor %.2lf", $1, $3); }

Não sei se isto esta bem ou não :S

Espero que me consigam ajudar.


Eu sou eu e eu sou aquele que sou eu...

Share this post


Link to post
Share on other sites
Rui Carlos

Tens %d quando devias ter %s.

Qual é o problema que tens?

Também podes experimentar colocar directamente o texto na produção ("write(" texto ")"), a ver se resolve o problema.

No segundo caso voltas a ter um problema semelhante com a formatação, usas %.2lf com uma string.

Também falta o lado esquerdo da produção.

E não percebi a utilidade da union.

Share this post


Link to post
Share on other sites
Umbus

Tens %d quando devias ter %s.

Qual é o problema que tens?

Também podes experimentar colocar directamente o texto na produção ("write(" texto ")"), a ver se resolve o problema.

No segundo caso voltas a ter um problema semelhante com a formatação, usas %.2lf com uma string.

Também falta o lado esquerdo da produção.

E não percebi a utilidade da union.

1º - Eu fui vendo em alguns exemplos e fui exprimentando entao o que é %s, %d e %.2lf ?

2º Na realidade nao sei se tenho um problema a realidade e que o meu linux nao esta a dar para funcionar :S. Dai perguntar se existe algum erro no codigo. Assim posso explicar o que fiz ao meu professor.

3º Não percebi o que querias dizer com  ("write(" texto ")"), podes dar um exemplo como tu fazer o write e o writeln?

4º entao o que devo usar, para colocar na variavel o valor da expressão? e transmitir o valor.

5º O que eu li o union serve para colocar as variaveis que uso, entao eu criei a variavel char var (que ate acho que deve ser um int) e colocar o token com a variavel que criei no union, depois fiz nas regras o que mostrei, mas nao sei se na realidade é o correcto. O meu guiao de aulas nessa parte esta um pouco confuso.


Eu sou eu e eu sou aquele que sou eu...

Share this post


Link to post
Share on other sites
Rui Carlos

1º - Eu fui vendo em alguns exemplos e fui exprimentando entao o que é %s, %d e %.2lf ?

http://www.cplusplus.com/reference/clibrary/cstdio/printf/

Isto são conhecimentos básicos de C...

2º Na realidade nao sei se tenho um problema a realidade e que o meu linux nao esta a dar para funcionar :S. Dai perguntar se existe algum erro no codigo. Assim posso explicar o que fiz ao meu professor.

Aquilo tem para lá alguns erros. E se não tens como testar, não sabes que erros tens no resto do código.

3º Não percebi o que querias dizer com  ("write(" texto ")"), podes dar um exemplo como tu fazer o write e o writeln?

escreve : 'write(' texto ')' {printf(...)}
        | 'writeln(' texto ')' {printf(...)}
        ;

4º entao o que devo usar, para colocar na variavel o valor da expressão? e transmitir o valor.

5º O que eu li o union serve para colocar as variaveis que uso, entao eu criei a variavel char var (que ate acho que deve ser um int) e colocar o token com a variavel que criei no union, depois fiz nas regras o que mostrei, mas nao sei se na realidade é o correcto. O meu guiao de aulas nessa parte esta um pouco confuso.

Noutro tópico já te disse como guardar variáveis. Já há uns anos que não uso o yacc, mas penso que nesta situação não precisas da union para nada.

Share this post


Link to post
Share on other sites
Umbus

escreve : 'write(' texto ')' {printf(...)}
        | 'writeln(' texto ')' {printf(...)}
        ;

Mas neste exemplo, como fazes se nao tiver o " ", no caso de ser uma expressao? Ou se em vez de ' ' ser mesmo " "

Noutro tópico já te disse como guardar variáveis. Já há uns anos que não uso o yacc, mas penso que nesta situação não precisas da union para nada.

entao uso o mesmo metedo no vector?

Eu sou eu e eu sou aquele que sou eu...

Share this post


Link to post
Share on other sites
Rui Carlos

Mas neste exemplo, como fazes se nao tiver o " ", no caso de ser uma expressao? Ou se em vez de ' ' ser mesmo " "

Isso será definido na produção texto.

As plicas é para dizer ao yacc para fazer match exactamente da string write( e da string ).

entao uso o mesmo metedo no vector?

Não percebi.

Share this post


Link to post
Share on other sites
Umbus

Hmm entao e uma optima ideia essa do write.

Quanto a pergunta do vector eu tenho isto:

int count = 0;
struct variaveis{
  char nome[50+1];
  int valor;
}vector[100];

%union{
char str;
int val;
}

%token <str> STRING
%token <var> INT

DECL  : STRING '=' INT {vector[count++].nome=$1; vector[count].valor=atoi($3); }

para o := como farias. O que tinha era:

varia op_atribuicao expr { printf("O valor da atribuicao %s e o valor %.2lf", $1, $3); }

Mas dizes que esta errado, para colocar dentro do vector. Mas fiquei sem perceber como colocas no vector esse valor de atribuição (ou seja se uma pessoa colocar variavel = 5+1; o valor vai para dentro da variavel de nome variavel). E aparecer isso em print.


Eu sou eu e eu sou aquele que sou eu...

Share this post


Link to post
Share on other sites
Rui Carlos

O objectivo é imprimir o valor usado na atribuição? Se for, em vez de guardares no vector, imprimes os valores. No entanto, parece-me um pouco estúpido fazê-lo.

Se podes ter expressões numa atribuição (e não apenas valores constantes), mudas o INT para Expr, e define as produções de Expr, de modo a que computem o seu valor.

Share this post


Link to post
Share on other sites
Umbus

Nao estou bem a perceber o que disseste. O que se pretende e colocar o valor da atribuicao numa variavel escolhida pelo utilizador. Eu so keria colocar um print para me aperceber disso :)


Eu sou eu e eu sou aquele que sou eu...

Share this post


Link to post
Share on other sites
Umbus

Então precisas de acrescentar o print às instruções que guardam o valor.

Como assim?

Isso será definido na produção texto.

As plicas é para dizer ao yacc para fazer match exactamente da string write( e da string ).

Mas assim nao vai aparecer as aspas?

Help please :'(


Eu sou eu e eu sou aquele que sou eu...

Share this post


Link to post
Share on other sites
Rui Carlos
texto deverá ter duas produções, uma para string (que conterá as aspas), e outra para expressões, que não terá aspas (aliás, era isso que tinhas inicialmente).

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • 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.