AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Lookahead-Parser und Reduktionsregeln

Ein Thema von Desmulator · begonnen am 28. Jun 2014 · letzter Beitrag vom 29. Jun 2014
Antwort Antwort
Benutzerbild von Desmulator
Desmulator

Registriert seit: 3. Mai 2007
Ort: Bonn
169 Beiträge
 
#1

Lookahead-Parser und Reduktionsregeln

  Alt 28. Jun 2014, 11:31
Guten Morgen,

Es geht um Parser und zwar möchte ich gerne einen Bottom-Up-Parser implementieren, der zuvor aus EBNF erzeugte Regel an einer Eingabe auswertet und entsprechend die Eingabe reduziert. Dazu kommt, dass ich keine Tabellen verwenden möchte. Also liegt ja ein Shift-reduce-parser nahe, aber da habe ich folgendes Problem:

Zitat:
A ← AB | B
C ← A + A
Das sind die Regeln und nun folgender Code:
Zitat:
BB+BBB
AB+BBB
A+BBB
A+ABB
CB
würde mir also jetzt einen Fehler ausgeben, obwohl sich die Eingabe vollkommen zu C reduzieren müsste. Was kann man da tun? O_o
Lars
There are 10 kinds of people in the world:
those who get binary, and those who don’t.
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#2

AW: Lookahead-Parser und Reduktionsregeln

  Alt 29. Jun 2014, 11:42
Die Grammatik ist wohl nicht eindeutig.
AB+AB => A+A => C
AB+AB => AA+AA => ACA

Soweit ich mich erinnere, musst Du den SR-Konflikt auflösen, durch zusätzliche Regeln.
  Mit Zitat antworten Zitat
Sailor

Registriert seit: 20. Jul 2008
Ort: Balaton
112 Beiträge
 
Delphi 2010 Professional
 
#3

AW: Lookahead-Parser und Reduktionsregeln

  Alt 29. Jun 2014, 13:39
Jein, aus dem Fragment läßt sich das nicht erschließen. Es kommt darauf an, wie C eingebunden ist:

X ← A | C
A ← AB | B
C ← A + A

ist eindeutig, läßt aber nur eine Addition zu.

X ← A
A ← AB | B | C
C ← A + A

läßt mehrmalige Additionen zu, ist aber mehrdeutig.

X ← A | C
A ← AB | B
C ← A + A | C + A

ist eindeutig und läßt mehrmalige Additionen zu.
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#4

AW: Lookahead-Parser und Reduktionsregeln

  Alt 29. Jun 2014, 16:10
Was für Grammatiken willst du denn überhaupt parsen? Kontextfreie? In dem Fall wäre es wohl vernünftig, die Definition erst mal in Chomsky-Normalform Greibach-Normalform zu bringen.

Mir ist nicht klar, was du mit „keine Tabellen“ meinst.

Geändert von Namenloser (29. Jun 2014 um 16:29 Uhr)
  Mit Zitat antworten Zitat
Sailor

Registriert seit: 20. Jul 2008
Ort: Balaton
112 Beiträge
 
Delphi 2010 Professional
 
#5

AW: Lookahead-Parser und Reduktionsregeln

  Alt 29. Jun 2014, 19:36
Zitat:
Was für Grammatiken willst du denn überhaupt parsen? Kontextfreie? In dem Fall wäre es wohl vernünftig, die Definition erst mal in Chomsky-Normalform Greibach-Normalform zu bringen.

Mir ist nicht klar, was du mit „keine Tabellen“ meinst.
Keine Tabellen: Er will sowas wie yacc nicht benutzen.
Vielleicht will er einen Early-Parser bauen.

Was soll die Umwandlung in eine Normalform bringen? Die Grammatik (sofern das obige Beispiel nicht nur ein Ausschnitt ist) erzeugt die leere Sprache (es fehlt zumindest eine Regel wie B ← <Number>) und sie hat 2 Satzsymbole. Das müßte vor weiteren Diskussionen erst mal geregelt werden.
  Mit Zitat antworten Zitat
Benutzerbild von Desmulator
Desmulator

Registriert seit: 3. Mai 2007
Ort: Bonn
169 Beiträge
 
#6

AW: Lookahead-Parser und Reduktionsregeln

  Alt 29. Jun 2014, 19:38
Was für Grammatiken willst du denn überhaupt parsen? Kontextfreie? In dem Fall wäre es wohl vernünftig, die Definition erst mal in Chomsky-Normalform Greibach-Normalform zu bringen.
Wirklich viele Gedanken habe ich mir über die Grammatik nicht gemacht. Momentan gehe ich davon aus, dass ich in EBNF-kodierte Grammatik erhalte und anhand dieser will ich eine Eingabe bearbeiten. Also zum einen überprüfen ob die Eingabe eine gültige Syntax hat und auf der anderen, diese Eingabe eben als Baum darstellen.

Mir ist nicht klar, was du mit „keine Tabellen“ meinst.
Eine "Aktions- und Goto-Tabelle".

Habe mir heute nochmal Gedanken gemacht und bin dabei auf zwei "Lösungen" gekommen:
1. Die zuletzt benutze Regel wird vorranig vor allen anderen Regeln angewandt. Also in dem Fall würde ich, statt noch der ersten Reduktion von B zu A nicht versuchen direkt eine weitere Regel anzuwenden, sondern mit Lookahead versuchen die Reduktion von A erneut zu benutzen.
Das ganze scheint mir aber sehr unsauber und irgendwie eher eine Symptombekämpfung als eine richtige Lösung.

2. Ich ermittle vor der Reduktion alle möglichen Reduktionen und merke mir diese. Dann wende ich eine dieser an. Sollte als Folge dieser Reduktion irgendwann ein Fehler auftreten, so springe ich zurück und versuche die nächste Reduktion. Dies setzte ich dann jeweils rekursiv so fort.
Würde bestimmt funktionieren, aber hat einen ziemlich großen aufwand, wenn man davon aus geht, dass in den meisten Fällen die Regeln eben nicht eindeutig sind.

Zitat:
Was soll die Umwandlung in eine Normalform bringen? Die Grammatik (sofern das obige Beispiel nicht nur ein Ausschnitt ist) erzeugt die leere Sprache (es fehlt zumindest eine Regel wie B ← <Number>) und sie hat 2 Satzsymbole. Das müßte vor weiteren Diskussionen erst mal geregelt werden.
Zitat:
B ← "0"|...|"9"
A ← AB | B
C ← A + A | C + A
Die obigen Regeln waren nur als Beispiel gedacht um das Problem anschaulich zu beschreiben.
Lars
There are 10 kinds of people in the world:
those who get binary, and those who don’t.

Geändert von Desmulator (29. Jun 2014 um 19:42 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:30 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz