Ich muss Ausdrücke basierend auf folgenden Regeln analysieren:
name:value
dargestellt wird.
So sieht ein typischer Ausdruck wie
aus filter1:45 hello world filter:5454
filter1:45 'hello world' filter:5454
hello world
'hello world' OR filter:43
Folgendes habe ich bisher versucht:
%Vor%Mit dieser Grammatik kann ich Strings wie
analysieren filter2:32 filter1:3243
Nach dem, was ich verstanden habe, kann ich csl
function mit einer Liste von Objekten versehen, und die Grammatik muss in dieser Reihenfolge sein. Was aber, wenn ich ein Objekt wie
filter34:43 hello filter32:3232
ODER
filter34:43 OR filter32:3232
Wie kann ich sagen, dass es in einem Ausdruck mehrere Arten von Objekten gibt (Filter, Ausdrücke, boolesche Werte)? Ist das mit Pflock möglich?
Von deiner Spezifikation in der Frage und den Kommentaren denke ich, dass dein Code nahe ist - aber du willst nicht das csl
. Ich habe den Code, von dem ich denke, dass er unten steht (es ist vielleicht nicht die eleganteste Implementierung, aber ich denke, es ist vernünftig). Sie müssen ein mögliches Problem vermeiden, dass BooleanLiteral
eine Untermenge von StringLiteral
ist. Dies bedeutet, dass Sie% code% nicht haben können
Das Ergebnis ist eine Liste von Objekten mit den richtigen Typen entsprechend Ihrer Spezifikation, denke ich. Ich denke, das Entscheidende ist, dass Sie Alternativen als Python LineExpression
hinzufügen können (d. H.% Co_de% bedeutet list
oder [LineFilter,StringLiteral]
). Der PEG-Parser versucht sie in der Reihenfolge, in der sie auftreten, d. H. Er versucht, die erste Übereinstimmung zu finden, und nur wenn es fehlschlägt, versucht er die zweite und so weiter.