Pegjs: Nicht gierige Operatoren für * , + und ?

Erstellt am 7. Okt. 2011  ·  7Kommentare  ·  Quelle: pegjs/pegjs

Ich habe eine Sprache, in der es wiederholte Instanzen des gleichen Musters gibt, in denen mir nur das erste Symbol wichtig ist. Beispielsweise:

          system       OBJECT IDENTIFIER ::= { mib-2 1 }
          interfaces   OBJECT IDENTIFIER ::= { mib-2 2 }
          at           OBJECT IDENTIFIER ::= { mib-2 3 }
          ip           OBJECT IDENTIFIER ::= { mib-2 4 }
          icmp         OBJECT IDENTIFIER ::= { mib-2 5 }
          tcp          OBJECT IDENTIFIER ::= { mib-2 6 }
          udp          OBJECT IDENTIFIER ::= { mib-2 7 }
          egp          OBJECT IDENTIFIER ::= { mib-2 8 }

Dieses einfache Beispiel könnte mit diesem Muster übereinstimmen (wobei _ ein Leerzeichen ist):

identifier _ "OBJECT IDENTIFIER" _ "::=" _ "{" _ identifier _ number _ "}"

Dies ist in diesem Fall keine so große Sache (ich habe das Muster bereits eingegeben :-) Aber die Sprache hat eine Reihe anderer großer haariger Konstrukte, die das vollständige Parsen nicht rechtfertigen (ich möchte nur, dass der Anfangsbezeichner in jeder Zeile den Job machen, den ich mir vorstelle).

Ich möchte etwas wie dieses Muster eingeben:

identifier _ "OBJECT IDENTIFIER" .*? "}"

bei dem die ".*?" ist nicht gierig - es verbraucht nur bis zum ersten Auftreten des Terminals. Könnte dies auf der Liste für PEG.js stehen? Vielen Dank.

Hilfreichster Kommentar

Im PEG- Formalismus können Sie leicht bis zu einem Abschlusszeichen vergleichen, indem Sie ein Prädikat zusammen mit dem Metazeichen . . Etwas wie:

"OBJECT IDENTIFIER" (!"}" .)* "}"

Ist das ausreichend für Sie?

Alle 7 Kommentare

Update: Dies könnte durch eine Wiederholungszahl (die eine Verallgemeinerung meines ursprünglichen Gedankens ist) erfüllt werden, wie in Google Groups vorgeschlagen unter: http://groups.google.com/group/pegjs/browse_thread/thread/2bea15581be45187

Im PEG- Formalismus können Sie leicht bis zu einem Abschlusszeichen vergleichen, indem Sie ein Prädikat zusammen mit dem Metazeichen . . Etwas wie:

"OBJECT IDENTIFIER" (!"}" .)* "}"

Ist das ausreichend für Sie?

Ja, das funktioniert einwandfrei. Danke!

@dmajda Was ist die empfohlene Vorgehensweise zum Zeichens , das vom Ausdruck !"}" ?

Beispielsweise:

   = chars:(!"-suffix" .)+ "-suffix"

"foo-suffix" => [[ '', 'f' ], ['', 'o' ], ['', 'o' ]]  // result
"foo-suffix" => ['f', 'o', 'o' ] // desired result

Ich konnte dies erreichen, indem ich !"-suffix" . in eine eigene Regel aufspalte, die nur das Ergebnis . zurückgibt, aber ich bin gespannt, ob es einen besseren Weg gibt.

66 wird dies beheben.

Ich denke, in der Zwischenzeit können Sie Folgendes verwenden:

    = chars:(!"-suffix" c:. {return c})+ "-suffix"

@islandr Bitte verwenden Sie Issues nicht als Ort, um Fragen zur Verwendung von PEG.js zu stellen. Vor allem, wenn sie geschlossen sind und vor allem, wenn Sie etwas fragen, bei dem andere Leute neben mir Ihnen helfen können. Der richtige Kanal ist die Google-Gruppe .

Entschuldigung David. Dachte, dies wäre ein guter Ort gewesen, da es so war?
in direktem Zusammenhang mit dem von Ihnen angegebenen Beispiel.

Am Mittwoch, den 9. Januar 2013 um 21:51 Uhr schrieb David Majda [email protected] :

@islandr https://github.com/islandr Bitte verwende Issues nicht als Ort
um Fragen zur Verwendung von PEG.js zu stellen. Vor allem, wenn sie geschlossen sind und
Vor allem, wenn du etwas fragst, was andere Leute neben mir können
helfen dir dabei. Der richtige Kanal ist die Google Grouphttp://groups.google.com/group/pegjs
.


Antworten Sie direkt auf diese E-Mail oder zeigen Sie sie auf Gi tHub anhttps://github.com/dmajda/pegjs/issues/57#issuecomment -12083927.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen