Pegjs: Verschiedene Fehler werden zurückgegeben, wenn der Cache aktiviert/deaktiviert wird

Erstellt am 28. Aug. 2016  ·  20Kommentare  ·  Quelle: pegjs/pegjs

Grammatik:

Statement
  = "{" __ !Statement Statement __ "}"
__
  = [ \t\r\n]*

Eingang:

{x}

Wenn der Ergebniscache deaktiviert ist, führt dies zu diesem Fehler:

"{" oder [ \t\r\n] erwartet, aber "x" gefunden.

Bei aktiviertem Ergebniscache ändert sich der Fehler in:

[ \t\r\n] erwartet, aber "x" gefunden.

Die Fehler sollten in beiden Fällen gleich sein.

Originalbericht

bug

Hilfreichster Kommentar

Sie können auf einen fix einen Blick hier .

Alle 20 Kommentare

Ich verlasse mich auf die ziemlich ausdrucksstarken SyntaxError s pegjs-Würfe, um die Syntaxvervollständigung für Benutzer zu erstellen.

Dieses Problem hindert mich jedoch daran, dies für kompliziertere Grammatiken zu tun:

  • bei aktiviertem Cache werden mögliche Übereinstimmungen unterdrückt
  • Ohne Cache verlangsamt sich das Parsen um Größenordnungen und ist damit unbrauchbar

Eine andere Grammatik, für die der Fehler gilt:

Start
    = Char+ End

End
    = "e"

Char
    = (!End [a-z])+

Eingang:

a

Wenn der Ergebniscache deaktiviert ist, führt dies zu diesem Fehler:

"e", [az] erwartet oder nicht "e", aber Ende der Eingabe gefunden.

Bei aktiviertem Ergebniscache ändert sich der Fehler in:

[az] erwartet, aber Ende der Eingabe gefunden.

Der Fehler "Cache deaktiviert" ist korrekt, da ae mit der Grammatik übereinstimmt.

Fehlgeschlagene Testfälle mit #555 hinzugefügt

Der Grund für dieses Problem scheint zu sein:

  • während der anfänglichen Auswertung einer Regel wird peg$expect aufgerufen , um erwartete Token aufzuzeichnen. In bestimmten Fällen ( peg$silentFails > 0 ) werden Token jedoch ignoriert.

  • Während der zwischengespeicherten Auswertung wird das zwischengespeicherte Ergebnis wiederhergestellt. An diesem Punkt muss der Parser nicht nur den neuen Parse-Zustand wiederherstellen, sondern auch relevante Aufrufe an peg$expect . Andernfalls werden die erwarteten Token verpasst. Dies äußert sich in den oben genannten unvollständigen Fehlermeldungen.

In einem lokalen Prototyp basierend auf [email protected] ich dieses Problem beheben, indem ich Anrufe an peg$expect aufzeichnete und wiedergab. Mit den Änderungen in https://github.com/pegjs/pegjs/commit/669f782a5f3928a2958147992eb07df5b0ecf54a wurde diese Sache jedoch viel komplizierter.

Ich könnte eine Lösung für pegjs@dev versuchen. Ich frage mich nur, ob ich in die richtige Richtung gehe.

Irgendwelche Kommentare @Mingun , @futagoza?

Können Sie mir Ihren lokalen Prototyp basierend auf [email protected] ?

Sie können auf einen fix einen Blick hier .

Bei verschachtelten stummgeschalteten Elementen funktioniert es noch nicht richtig:

Grammatik:

Start
  = Char+ End
End "end"
  = "e"
Char
  = !End [a-z]'

Eingang:

a

Erwartete Nachricht:

Erwartetes Ende oder [az], aber Ende der Eingabe gefunden.

Tatsächliche Nachricht:

Erwartetes Ende, "e" oder [az], aber Ende der Eingabe gefunden.

Vgl. fehlgeschlagener Testfall .

@nikku Dies sollte jetzt behoben sein (danke 🙇 ), wobei alle 3 Testfälle bestanden sind (einschließlich des 3. für verschachtelte stummgeschaltete Elemente).

Der Fix ist in der neuesten Version von pegjs@dev gerade an NPM, [email protected] (https://github.com/pegjs/pegjs#latest) gepusht.

Vielen Dank.

Ich habe deine Änderungen heute getestet.

Von dem, was ich sehe, führt https://github.com/pegjs/pegjs/commit/f5b323b40124e9ebe1336b509af0716d5a31ce55#diff -cd2c6b13fdcedf68a390c8bb6ea65cafR148 eine Breaking Change ein, da es effektiv den Wächter in --no-cache .

😨 Ups, das war ein blöder Fehler. Werde das bald beheben, danke für die Hinweise

Versucht, einen Testfall zu erstellen, ist aber fehlgeschlagen: Schrei:. Ich sehe jedoch, dass sich diese Zeile auf eine meiner komplizierteren Grammatiken auswirkt.

Die Wache in https://github.com/pegjs/pegjs/commit/d06a5b52efcf0fa4b9e5bf21f97607786c1c7db5 wiederhergestellt und die Änderungen auf pegjs@dev verschoben, sagen Sie mir, ob dies das Problem behebt

@nikku Ist es behoben oder hast du dieses Problem immer noch? Wollte nur wissen ob ich das Thema nochmal öffnen soll.

Es ist repariert.

@nikku - Es ist nicht behoben. Es wurde nichts freigegeben. npm immer noch 0.10.0 , und dies wurde zu einem Feature-Zweig 0.11.0 , von dem Ryuu sagte, dass er nie wirklich veröffentlicht werden wird

Aus genau diesem Grund habe ich aufgehört auf pegjs zu hoffen und vor langer Zeit woanders gesucht.

Keine Freigabe = niemand kann es wirklich benutzen. Pegjs war historisch schlecht mit Veröffentlichungen.

Ich hoffe, den Peg-Release-Zyklus ändern zu können durch:

  1. Bitten Sie den ursprünglichen Besitzer, mir zu erlauben, ein 0.12.0 von 0.10.0 neu zu schneiden,
  2. Rosinenpickerei und konsequent schnelle Veröffentlichung von Features aus dem inzwischen toten 0.11.0 Zweig,
  3. die ungewöhnlichen Tools und Konfigurationen zugunsten eines Standard-Entwicklungs-Setups zu entfernen und
  4. um die Bibliothek an einen Ort zu bringen, an dem das Hinzufügen von Funktionen für die Community einfach ist

Wenn so etwas passiert, unter irgendwelchen Händen, und dann tatsächlich Releases gestartet werden, würden Sie ihm noch eine Chance geben?

Wünsche dir viel Glück, um das zu erreichen.

danke

Wir werden sehen.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

richb-hanover picture richb-hanover  ·  7Kommentare

dmajda picture dmajda  ·  7Kommentare

mattkanwisher picture mattkanwisher  ·  5Kommentare

doersino picture doersino  ·  15Kommentare

audinue picture audinue  ·  13Kommentare