erkennen Ruby-Code in der Treetop-Grammatik

8

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:

%Vor%

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.

    
Sarah Vessels 29.10.2010, 18:28
quelle

4 Antworten

11

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.

    
Jörg W Mittag 29.10.2010, 20:41
quelle
2

Nein

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.

    
DigitalRoss 29.10.2010 18:43
quelle
1

Vielleicht scherze ich, aber wenn Yacc weniger komplex ist als Ruby, dann könntest du Yacc in der Baumkrone erkennen, die dann die für Yacc erstellte Rubingrammatik benutzt.

    
vurte 31.10.2010 18:06
quelle
0

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).

    
cliffordheath 06.05.2015 02:50
quelle

Tags und Links