2009-03-02 13 views
1

Ich habe einen Parser, der effektiv eine Reihe von rekursiven Funktionen ist, die auf einer Sequenz von Lexer-Tokens arbeiten.Wodurch wird eine F # -Sequenz erneut aufgezählt?

Das Problem, das ich renne, ist, dass die Sequenz bei rekursiven Funktionsaufrufen von vorne zu beginnen scheint. In Anbetracht der folgenden Skelett-Definition für die Funktion 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 

Die Funktion parse_token in einem Aufruf in Parse führen kann. In diesem Fall wird der Parameter tokens am Anfang der Sequenz positioniert.

Haben Sie Ideen, wie Sie die Sequenz so positionieren können, wo sie sein muss?

tia

Antwort

2

Ich glaube, Sie einen etwas größeren Schnipsel schreiben müssen, da ich ziemlich bin nicht Sie folgende.

Das heißt, eine Sequenz (IEnumerable) ist nur das - eine Sequenz, und jedes Mal, wenn Sie für (foreach) oder Seq.Whatever darüber, wird es die Sequenz 'iterieren'. Ich bin unklar, was Sie tun wollen und was Sie erwarten, aber für eine Analyse kann die Darstellung von "Tokens" als Sequenz "falsch" sein, da Sie Tokens normalerweise in eine konsumierte/committete Region und eine Lookahead-Region partitionieren.

Beachten Sie auch, dass Sie in der Regel nicht über eine Sequenz 'iterieren' wollen, um Nebenwirkungen zu haben.

+0

Sie sind ziemlich richtig. Ich erkannte, dass nachdem ich die Frage gestellt hatte, und erkannte, was das Problem war. Ich habe versucht, das Äquivalent eines gemeinsamen IEnumerator zu erstellen, was der falsche Ansatz war. Ich habe es über Listen aufgebaut und den unverbrauchten Rest herumgereicht. – kolosy

Verwandte Themen