Gibt es eine Möglichkeit, Kontextinformationen an Parser weiterzugeben?

8

Ich analysiere eine kleine deklarative Sprache, in der man Variablen deklarieren kann (mit einem Typ), und später, genauso wie in den meisten anderen Sprachen, wird der Name (ohne den Typ) verwendet.

Die Deklaration der Variablen würde so aussehen:

%Vor%

Wenn der Typ weggelassen wird, sollte der Standardtyp wie im ersten Fall object sein. Deshalb habe ich einen speziellen Parser, der eine Liste meines eigenen Domänenobjekts namens LiftedTerm zurückgibt (man kann einfach davon ausgehen, dass es ein Tupel mit dem Namen der Variablen und dem Typ der Variablen ist, in Wirklichkeit gibt es noch mehr es aber für dieses Problem irrelevant):

%Vor%

All das funktioniert vollkommen in Ordnung.

Jetzt weiter unten im gleichen 'Bereich' muss ich die Teile analysieren, wo es einen Verweis auf diese Variablen gibt. Die Variable wird offensichtlich nicht erneut vollständig deklariert. Im obigen Beispiel enthalten die Orte, an denen ?varname1 verwendet wird, nicht type1 . Wenn ich jedoch den Rest der Eingabe analysiere, möchte ich die Referenz des richtigen LiftedTerm -Objekts erhalten und nicht nur eine Zeichenfolge.

Ich habe einige rekursive Strukturen an der Stelle, daher möchte ich diese Zuordnung nicht im obersten Parser durchführen. Ich möchte keine 'globale Zuordnung' dieser Objekte in meinem RegexParsers -Objekt vornehmen, da die meisten davon nur für einen kleinen Teil der Eingabe relevant sind.

Gibt es eine Möglichkeit, Kontextinformationen an einen Parser weiterzuleiten? Idealerweise übergebe ich die Liste von LiftedTerm (oder noch besser eine Map aus den Variablennamen String -> LiftedTerm ) in die rekursiven Parser-Aufrufe.

(Entschuldigung, wenn das etwas Offensichtliches ist, bin ich immer noch neu bei Scala und noch neuer bei Parserkombinatoren).

    
jbx 02.01.2014, 14:38
quelle

2 Antworten

1

AFAIK, Scalas Kombinator-Parser-Bibliothek ist auf kontextfreie Grammatiken beschränkt. Daher wird Ihr Anwendungsfall nicht unterstützt.

Der richtige Weg zu gehen wäre, scala.util.parsing.combinator.Parsers zu erweitern und eine benutzerdefinierte Parser -Klasse bereitzustellen, die Ihren Kontext herumträgt. Dann müssen Sie alle Kombinatoren definieren, um auch mit dem Kontext umgehen zu können.

edit: Wie unten erwähnt, haben Parser eine Methode into und flatMap . Wenn Sie also einen Parser haben, der Ihren Kontext ergibt, können Sie ihn mit einem anderen Parser kombinieren, der einen Kontext im monadischen Stil benötigt .

    
choeger 16.02.2014 21:46
quelle
0

"Gibt es eine Möglichkeit, Kontextinformationen an einen Parser weiterzuleiten?" Ja. Zum Beispiel ist hier eine Spielzeugimplementation des Lambda-Kalküls, die Variablennamen löscht.

%Vor%

und kann mit

analysiert werden %Vor%

Beachten Sie, dass die Kontextinformationen durch die Analyse übergeben werden.

    
user833970 16.03.2018 18:22
quelle

Tags und Links