Ich versuche Treetop zu verwenden, um eine ERB-Datei zu analysieren. Ich muss mit folgenden Zeilen umgehen können:
%Vor% Da Treetop in Ruby geschrieben ist und Sie Treetop-Grammatiken in Ruby schreiben, gibt es bereits einen bestehenden Weg in Treetop zu sagen "hey, suchen Sie hier nach Ruby-Code und geben Sie mir seine Aufschlüsselung" ohne dass ich separat schreiben muss Regeln für alle Teile der Ruby-Sprache? Ich suche nach einem Weg, in meiner .treetop
Grammatik-Datei etwas zu haben wie:
Wo ruby_code
durch einige Regeln behandelt wird, die Treetop bietet.
Bearbeiten: jemand anderes hat ERB mit Ruby geparst -lex, aber ich habe Fehler beim Versuch zu reproduzieren, was er getan hat. Das Rlex-Programm hat beim Generieren der Parser-Klasse keine vollständige Klasse erzeugt.
Bearbeiten: richtig, so dass Sie deprimierend sind, aber danke für die Info. :) Für mein Masterprojekt schreibe ich einen Testfallgenerator, der mit ERB als Eingabe arbeiten soll. Glücklicherweise muss ich für meine Zwecke nur ein paar Dinge im ERB-Code erkennen, wie zum Beispiel if
-Anweisungen und andere Bedingungen sowie Schleifen. Ich denke, ich kann mit der Treetop-Grammatik aufwarten, um dem gerecht zu werden, mit dem Vorbehalt, dass es für Ruby nicht vollständig ist.
Soweit ich weiß, hat noch niemand eine Treetop-Grammatik für Ruby erstellt. (In der Tat war niemand jemals in der Lage, irgendeine Grammatik für Ruby zu erstellen, außer der YACC-Grammatik, die mit MRI und YARV geliefert wird.) Ich weiß, dass der Autor von Treetop seit mehreren Jahren an einem arbeitet aber es ist keine triviale Angelegenheit. Das Anwenden der ANTLR-Grammatik, die in XRuby verwendet wird, dauerte ungefähr 5 Jahre und ist immer noch nicht vollständig kompatibel.
Rubys Syntax ist wahnsinnig , überwältigend komplex.
Ich glaube nicht. Die Angabe der komplexen und subtilen Ruby-Grammatik in der Baumkrone wäre eine große Errungenschaft, aber es sollte möglich sein.
Das eigentliche Rubingramm ist in yacc geschrieben. Nun, Yacc ist ein legendäres Werkzeug, aber Baumkrone erzeugt eine mächtigere Klasse von Parsern, also sollte es möglich sein und vielleicht hat jemand es getan.
Es ist kein Nachmittagsprojekt.
Für Ihre Zwecke können Sie wahrscheinlich ohne die Analyse von Ruby alles durchgehen. Was Sie wirklich brauchen, ist eine Möglichkeit, den% & gt; das schließt einen Ruby Block ab. Wenn Sie niemals einen Fehler machen möchten, wenn der Ruby-Code diese abschließenden Zeichen enthält, müssen Sie feststellen, dass diese Zeichen im Ruby-Text vorkommen können. was bedeutet, dass Sie alle Arten von Literalen erkennen müssen.
Aber für Ihre Zwecke können Sie wahrscheinlich die wahrscheinlichsten Fälle erkennen, in denen% & gt; würde in Ruby-Text auftreten und nur diese Fälle ignorieren. Dies setzt natürlich voraus, dass jeder verbleibende Fehler behandelt werden kann, indem Sie Ihren Benutzer dazu bringen, den ERB etwas anders zu schreiben.
Für was es wert ist, treetop selbst "analysiert" Ruby blockiert auf diese Weise; es zählt nur {und} Zeichen, bis der schließende gefunden wird. Wenn also Ihr Block ein} in einer literalen Zeichenfolge enthält, sind Sie defekt (aber Sie können umgehen, indem Sie die passende in einen Kommentar einfügen).