Basierend auf der Spur Sie zur Verfügung gestellt haben, vermute ich, dass die Grammatik wie folgt aussieht:
- E → T | E + T
- T → F | T * F
- F → num
ohne andererseits die Angabe verwendet yacc
die LALR (1) Parsing-Algorithmus, der einen Token von Vorgriffs-verwendet Bruch Verbindungen zu helfen, wenn bestimmt wird, ob eine Verschiebung durchzuführen, oder die Aktion zu reduzieren. An dem von Ihnen angegebenen Punkt hatte der Parser T
auf seinem Stack mit einem Lookahead von *
. Beachten Sie, dass es in der Grammatik keine Möglichkeit gibt, dass ein *
Symbol einem T
Nichtterminal in irgendeiner Ableitung rechtlich folgt (formal, *
∉ FOLLOW (T
)). Das bedeutet, dass der Parser hier nicht reduziert werden soll, da LALR (1) niemals bei einem Lookahead, das nicht in der FOLLOW-Menge für das gegebene Nonterminal gesetzt ist, reduziert wird.
Um zu sehen, wie dies genau funktioniert, könnten Sie den LALR (1) Parsing-Automaten für diese Grammatik konstruieren und sich die Lookaheads anschauen, die jedem Element zugeordnet sind. In diesem Zustand wird es zwei Elemente, ein fertiges Element des Formulars
T → F
und der folgende Verschiebung Artikel:.
T → T * F
Das Reduzieren Element wird nicht *
in seiner Lookahead-Set (ich glaube, es wird nur haben $
), so dass die LALR (1) Zustand für den Parser wird wie folgt aussehen:.
T → F. [$]
T → T * F [$]
Wenn der Parser einen *
sieht, weiß es daher, die Reduktion nicht vorzunehmen und stattdessen zu verschieben, da der Vorausschau-Set für das Reduzieren-Element kein *
enthält.
Genau genommen wird das FOLLOW-Set für die SLR (1) -Parser-Konstruktion verwendet - LALR (1) und LR (1) -Spur-Lookaheads pro Staat, was für einige Ecken besser funktioniert. Aber für dieses Beispiel sind SLR (1), LALR (1) und LR (1) alle genau gleich. –
@ChrisDodd Definitiv. LALR (1) Parser verwenden LA-Sets, die Teilmengen von FOLLOW-Sets sind. Wenn sich also etwas nicht in einer FOLLOW-Menge befindet, ist es sicherlich nicht im Lookahead-Set für einen LALR (1) -Parser, obwohl die Umkehrung nicht wahr ist. – templatetypedef