2016-11-22 4 views
0

Ich konnte Unterstützung für die Grammatik meines Parsers für abwechselnde Zeichen hinzufügen (z. B. ababa oder baba), indem Sie mit this question folgen.Parse-Grammatik abwechselnd und wiederholen

Ich versuche nun, das zu erweitern, indem ich Wiederholungen von Zeichen erlaube.

Zum Beispiel würde ich gerne auch abaaabab und aababaaa unterstützen können. In meinem speziellen Fall ist nur die a erlaubt zu wiederholen, aber eine Lösung, die das Wiederholen von b 's erlaubt, wäre auch nützlich.

die Regeln von der anderen Frage Gegeben:

expr ::= A | B 
A ::= "a" B | "a" 
B ::= "b" A | "b" 

... ich versuchte es erstreckt Wiederholungen zu unterstützen, etwa so:

expr ::= A | B 

# support 1 or more "a" 
A_one_or_more = A_one_or_more "a" | "a" 

A ::= A_one_or_more B | A_one_or_more 
B ::= "b" A | "b" 

... aber das Grammatik ist mehrdeutig. Ist es möglich, dass dies eindeutig gemacht wird, und wenn ja, könnte mir jemand helfen, es zu disambiguieren?

Ich verwende die lemon parser, die ein LALR (1) Parser ist.

Antwort

1

Der Punkt des Parsing, im allgemeinen ist zu parsen; das heißt, bestimmen Sie die syntaktische Struktur einer Eingabe. Das ist wesentlich anders als einfach zu überprüfen, ob eine Eingabe zu einer Sprache gehört.

Zum Beispiel ist die Sprache, die mit dem regulären Ausdruck beschrieben wird, kann von beliebigen Wiederholungen von a und b besteht werden (a|b)*, die als

in BNF geschrieben werden können
S ::= /* empty */ | S a | S b 

Aber das ist wahrscheinlich die syntaktische Struktur nicht erfassen du versuchst zu definieren. Auf der anderen Seite, da Sie diese Struktur nicht angeben, ist es schwer zu wissen.

Hier ein paar mehr Möglichkeiten geben, die unterschiedlichen Parse-Bäume bauen:

S ::= E | S E 
E ::= A b | E b 
A ::= a | A a 

S ::= E | S E 
E ::= A B 
A ::= a | A a 
B ::= b | B b 

Wenn eine Grammatik zu schreiben, eine Sprache zu analysieren, ist es sinnvoll, durch Ziehen von Ihnen vorgeschlagenen Parse-Bäume zu beginnen . Normalerweise können Sie die Grammatik direkt aus der Form der Bäume schreiben, was zeigt, dass eine formale Grammatik in erster Linie ein Werkzeug ist, da es die Sprache so beschreibt, wie informelle Beschreibungen es nicht können. Durch die Verwendung eines Parser-Generators zum Umwandeln dieser Grammatik in einen Parser wird sichergestellt, dass der Parser die beschriebene Sprache implementiert. Zumindest ist das das Ziel.

+0

Vielen Dank für Ihre ausführliche Antwort. Es macht absolut Sinn, aber leider fehlen meine Fähigkeiten in diesem Bereich, so dass es mir schwer fällt, meine Ambiguität zu lösen. Ich werde mich weiter mit meinem speziellen Problem beschäftigen und hoffentlich kann ich es lösen. Danke nochmal! – JesseBuesking

+0

@JesseBuesking: Sie können eine bessere Antwort erhalten, wenn Sie eine genauere Frage stellen. Von deinem Kommentar zu der anderen Antwort, ich nehme an, dass deine Grammatik nicht wirklich so aussieht wie die, nach der du fragst. Ich stehe jedoch zu meiner Aussage, dass es am besten ist, einige Syntaxdiagramme zu zeichnen, um Ihr Denken zu klären. – rici

1

Hier ist ein nettes Werkzeug zum Überprüfen Ihrer Grammatik online http://smlweb.cpsc.ucalgary.ca/start.html. Es akzeptiert tatsächlich the grammar you provided als eine gültige LALR (1) Grammatik.

Eine andere LALR (1) Grammatik, dass eine der ermöglicht reapeating, wäre:

S ::= "a" S | "a" | "b" A | "b" 
A ::= "a" S . 
+0

Ich habe versucht, meine Grammatik für diese Frage zu vereinfachen, und anscheinend habe ich es zu sehr vereinfacht, da es noch mehrdeutig ist.Die a's und b's in meinem Beispiel sind eigentlich die Ergebnisse von Unterregeln, und irgendwie verursacht das meine Zweideutigkeit. Danke für Ihre Antwort! – JesseBuesking

Verwandte Themen