Ich implementiere ein neues DSL in Marpa und (von Regexp :: Grammars kommend) bin ich mehr als zufrieden. Meine Sprache unterstützt eine Reihe von unären und binären Operatoren, Objekte mit C-style Bezeichnern und Methodenaufrufe unter Verwendung der bekannten Punktnotation. Zum Beispiel:Marpa: Kann ich Schlüsselwörter explizit als Bezeichner verbieten?
foo.has(bar == 42 AND baz == 23)
fand ich die prioritized rules Funktion von Sprache Marpas Grammatikbeschreibung angeboten und haben sich auf diesem viel verlassen, so dass ich fast nur eine G1 Regel Expression
. Auszug (viele Alternativen, und semantischen Aktionen der Kürze halber weggelassen):
Expression ::=
NumLiteral
| '(' Expression ')' assoc => group
|| Expression ('.') Identifier
|| Expression ('.') Identifier Args
| Expression ('==') Expression
|| Expression ('AND') Expression
Args ::= ('(') ArgsList (')')
ArgsList ::= Expression+ separator => [,]
Identifier ~ IdentifierHeadChar IdentifierBody
IdentifierBody ~ IdentifierBodyChar*
IdentifierHeadChar ~ [a-zA-Z_]
IdentifierBodyChar ~ [a-zA-Z0-9_]
NumLiteral ~ [0-9]+
Wie Sie sehen, ich bin mit der Scanless Schnittstelle (SLIF). Mein Problem ist, dass diese parsen auch, zum Beispiel:
foo.AND(5)
Marpa weiß, dass es nur eine Kennung nach einem Punkt sein kann, so dass er nicht die Ansicht, auch die Tatsache, dass AND
könnte ein Schlüsselwort sein. Ich weiß, dass ich dieses Problem vermeiden kann, indem ich eine separate Lexing-Stufe mache, die AND
explizit als Schlüsselwort identifiziert, aber dieser kleine Papierschnitt ist die Mühe nicht wirklich wert.
Gibt es eine Möglichkeit in SLIF, die Identifier
-Regel auf Nicht-Schlüsselwort-Bezeichner zu beschränken?
Was meinen Sie mit "Schlüsselwort"? 'assoc' und' separator' sind Schlüsselwörter im Marpa-Jargon. – choroba
@choroba, Er meint, wenn er einen Operator 'AND' definiert, will er nicht, dass er als Bezeichner erlaubt ist. – ikegami
Ich habe das nicht getestet, aber vielleicht möchten Sie sich das 'latm' Adverb ansehen. Dies ermöglicht es Ihnen, Marpas Wissen darüber, was Lexem akzeptabel ist, auf einer Lexem-Basis auszuschalten - was es in der Tat "dumm" für das eine Lexem macht, so dass es denkt, dass ein "UND" OK ist, und dann scheitern Sie die Analyse, wie Sie wollen. Koppeln Sie dies vielleicht mit einer höheren Lexempriorität, so dass 'AND' als Operator gegenüber 'AND' als Bezeichner bevorzugt wird. Aus der Spitze meines Kopfes, aber ich hoffe, es hilft. –