2010-11-02 24 views
1

Donc j'écris ce scanner réentrant avec flex et j'utilise l'option de pile pour suivre l'état. Selon la documentation, il semble queyy_top_state() semble échouer avec flex

yy_push_state(SCRIPT, yyscanner); 
//now yy_top_state(yyscanner) == SCRIPT; should eval true right? 

mais quand je mets la printf suivante() immédiatement après yy_push_state()

printf("SCRIPT=%d; DQUOTE=%d; CURRENT=%d\n", SCRIPT, DQUOTE, 
     yy_top_state(yyscanner)); 

je reçois ce en retour pour la sortie

SCRIPT=2; DQUOTE=3; CURRENT=1 

S'il vous plaît indiquer ce que je fais mal si quelque chose du tout.

Merci d'avance

+0

quelle valeur attendez-vous; Quelle est la valeur de NEWSTATE? –

+0

question bâclée, mon mauvais. NEWSTATE était pseudo pour SCRIPT. ce qui veut dire que je suis vraiment en train d'exécuter yy_push_state (SCRIPT, yyscanner); mais yy_top_state() ne semble pas suivre cela. * fixed * –

Répondre

2

Non, je ne pense pas. Basé sur le code que j'ai vu, c'est l'état actuel qui est poussé sur la pile, alors l'état est alors changé au nouvel état.

Après avoir élargi la pile si nécessaire, yy_push_state(new_state) exécute:

(yy_start_stack)[(yy_start_stack_ptr)++] = YY_START; 
BEGIN(new_state); 

YY_START est une macro basée sur l'état actuel et BEGIN est ce qui distingue le nouvel état.