Implementieren des Lookahead-Iterators für Strings in Python

7

Ich mache ein Parsing, das einen Lookahead-Token benötigt. Was ich möchte, ist eine schnelle Funktion (oder Klasse?), Die einen Iterator nehmen und in eine Liste von Tupeln in der Form (Token, Lookahead) verwandeln würde, so dass:

%Vor%

Im Grunde wäre das praktisch, um in Iteratoren wie diesem nach vorne zu schauen:

%Vor%

Obwohl ich nicht sicher bin, ob es einen Namen für diese Technik oder Funktion in itertools gibt, die das schon tun wird. Irgendwelche Ideen?

Danke!

    
Scott 23.06.2011, 00:30
quelle

5 Antworten

11

Es gibt einfachere Möglichkeiten, wenn Sie nur Listen verwenden - siehe Svens Antwort. Hier ist eine Möglichkeit, dies für allgemeine Iteratoren zu tun:

%Vor%

So verwenden Sie es in einer for-Schleife wie in Ihrer Frage.

%Vor%

Schließlich ist hier die Funktion, nach der Sie suchen

%Vor%     
John La Rooy 23.06.2011, 00:37
quelle
8

Ich mag sowohl Svens als auch gnibblers Antworten, aber aus irgendeinem Grund gefällt es mir, meinen eigenen Generator zu rollen.

> %Vor%

Getestet:

%Vor%

Bearbeiten : Karl und Ninjagecko heben einen ausgezeichneten Punkt an - die übergebene Sequenz kann None enthalten, und daher kann die Verwendung von None als endgültiger Lookahead-Wert zu Mehrdeutigkeit führen. Aber es gibt keine offensichtliche Alternative; Eine Modulebenenkonstante ist möglicherweise in vielen Fällen der beste Ansatz, kann aber für eine einmalige Funktion wie diese übertrieben sein - ganz zu schweigen von der Tatsache, dass bool(object()) == True zu einem unerwarteten Verhalten führen kann. Stattdessen habe ich einen null_item -Parameter mit einem Standardwert von None hinzugefügt - so können Benutzer alles einbringen, was für ihre Bedürfnisse sinnvoll ist, sei es eine einfache object() sentinel, eine Konstante ihrer eigenen Erstellung, oder sogar eine Klasseninstanz mit speziellem Verhalten. Da die meiste Zeit None das offensichtliche und möglicherweise sogar das erwartete Verhalten ist, habe ich None als Standard verlassen.

    
senderle 23.06.2011 01:05
quelle
6

Der übliche Weg, dies für eine Liste a zu tun, ist

%Vor%

Für das letzte Token erhalten Sie None als Look-Ahead-Token.

Wenn Sie die Kopie der Liste vermeiden möchten, die von a[1:] eingeführt wurde, können Sie stattdessen islice(a, 1, None) verwenden. Für eine geringfügige Modifikation, die für beliebige Iterables funktioniert, siehe die Antwort von gnibbler . Für eine einfache, leicht verständliche Generatorfunktion, die auch für beliebige Iterables arbeitet, siehe die Antwort durch sendele .

    
Sven Marnach 23.06.2011 00:34
quelle
2

Hier finden Sie möglicherweise die Antwort auf Ihre Frage: Verwenden von Lookahead mit Generatoren .

    
jena 23.06.2011 00:34
quelle
1

Ich halte alle diese Antworten für falsch, da sie unvorhergesehene Fehler verursachen, wenn Ihre Liste None enthält. Hier ist mein Beispiel:

%Vor%

Beispiel:

%Vor%

Beispiel, wie diese Antwort besser ist:

%Vor%     
ninjagecko 23.06.2011 06:04
quelle

Tags und Links