2009-03-02 4 views
1

J'ai un analyseur qui est effectivement un ensemble de fonctions récursives fonctionnant sur une séquence de jetons lexers.Qu'est-ce qui provoque la ré-énumération d'une séquence F #?

Le problème que je rencontre est que la séquence semble redémarrer depuis le début sur les appels de fonction récursifs. Compte tenu de la définition du squelette suivant pour la fonction Parse

let restricted = Seq.take_while token_search tokens 
    let compiled_nodes = Seq.fold (fun list (next: Lexer.Token) -> list @ parse_token this restricted next) [] restricted 

La fonction parse_token peut entraîner un appel en Parse.

Cependant, lorsque cela se produit, le paramètre tokens finit par être positionné au début de la séquence.

Des idées sur la façon de garder la séquence positionnée là où elle doit être?

tia

Répondre

2

Je pense que vous devrez peut-être publier un extrait légèrement plus grand, comme je ne suis pas tout à fait vous suivre. Cela dit, une séquence (IEnumerable) est juste - une séquence, et chaque fois que vous pour (foreach) ou Seq.Whatever par-dessus, il va «re-itérer» la séquence. Je ne sais pas ce que vous voulez faire, et ce que vous attendez, mais pour une analyse, représenter des 'jetons' comme une séquence peut être 'faux', car vous partitionnez généralement des jetons en une région consommée/engagée et une région de lookahead. Notez également que vous ne voulez généralement pas que l'itération sur une séquence ait des effets secondaires.

+0

vous avez tout à fait raison. Je me suis rendu compte qu'après avoir posté la question, et réalisé quel était le problème. J'essayais de construire l'équivalent d'un IEnumerator partagé, ce qui était la mauvaise approche. J'ai fini par le construire sur des listes, en passant autour du reste non consommé. – kolosy

Questions connexes