Yacc Problema: tornar os dados disponíveis na próxima Non Terminal
Pergunta
Eu quero fazer algumas variáveis ??que geram em b disponível em c:
a : b c { ...some code...}
Um exemplo simples:
b : X { int result = 0; }
| Y { int result = 1; }
para que eu possa, mais tarde na c digamos:
c : D { printf(result + 1); }
| E { printf(result + 2); }
Existe alguma chance de fazer isso? Qualquer ajuda seria muito apreciada!
Solução
result
deve ser uma variável global. Você pode fazer isso, incluindo
%{
int result;
%}
na parte superior do seu arquivo YACC. Claro, você também deve substituir int result = 0
e int result = 1
com result = 0
e result = 1
respectivamente.
Outras dicas
Você pode fazer como Can sugeriu, no entanto, geralmente não é uma boa idéia para globals uso em regras de sintaxe. Declarar um tipo para b
e c
assim que suas regras parecido com este:
%union {
int result;
};
%type <result> a b
%start a
%%
b : X {$$ = 0;} | Y {$$ = 1;} ;
c : D {$$ = 1;} | E {$$ = 2;} ;
a : b c {printf("%d", $1 + $2);};
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow