Frage

Ich versuche, Treetop eine ERB-Datei zu analysieren. Ich muss in der Lage sein, Linien zu behandeln wie die folgenden:

<% ruby_code_here %>
<%= other_ruby_code %>

Da Treetop ist in Ruby geschrieben, und Sie schreiben Treetop in Ruby Grammatiken, gibt es bereits einigen bestehenden Weg in Treetop zu sagen: „Hey, sucht Ruby-Code hier, und geben Sie mir ihre Aufschlüsselung“ ohne dass ich getrennt zu schreiben, Regeln alle Teile der Sprache Ruby zu behandeln? Ich bin auf der Suche nach einer Möglichkeit, in meiner .treetop Grammatikdatei, habe so etwas wie:

rule erb_tag
  "<%" ruby_code "%>" {
    def content
      ...
    end
  }
end

Wo ruby_code von einigen Regeln gehandhabt wird, dass Treetop bietet.

Edit: jemand anderes geparsten ERB mit Ruby -lex, aber ich habe Fehler versucht, zu reproduzieren, was er tat. Das rlex Programm hat keine vollständige Klasse produzieren, wenn es die Parser-Klasse erzeugt.

Edit: rechts, so dass Sie viel sind deprimierend, aber danke für die Info. :) Für mein Master-Projekt, ich bin als Eingabe mit ERB, dass der Bedarf an Arbeit einen Testfall-Generator zu schreiben. Zum Glück für meine Zwecke, ich brauche nur ein paar Dinge in dem ERB-Code, wie if Aussagen und andere conditionals sowie Schleifen zu erkennen. Ich denke, ich kann mit Treetop Grammatik kommen, dass übereinstimmen, mit dem Vorbehalt, dass es nicht vollständig für Ruby ist.

War es hilfreich?

Lösung

Soweit ich weiß, niemand hat noch eine Treetop Grammatik für Ruby erstellt. (In der Tat hat niemand jemals in der Lage zu erstellen jeder Grammatik für Ruby andere als die YACC Grammatik, dass Schiffe mit MRI und YARV.) Ich weiß, dass der Autor von Treetop wurde auf einem für mehrere Jahre , aber es ist keine triviale Aufgabe. Erste die ANTLR Grammatik, die direkt in XRuby verwendet wird, etwa 5 Jahre gedauert hat, und es ist noch nicht vollständig kompatibel.

Rubys Syntax ist irrsinnig , mindbogglingly komplex.

Andere Tipps

Nein


Das glaube ich nicht so. die komplexe und subtile Ruby-Grammatik in Baumwipfel Angeben eine große Leistung sein würde, aber es sollte möglich sein.

Die tatsächliche Rubin ist GRAMMER in yacc geschrieben. Nun yacc ist ein legendäres Werkzeug aber Baumwipfel erzeugt eine leistungsstärkere Klasse von Parsern, so dass es möglich sein sollte, und vielleicht jemand hat es getan.

Es ist kein Nachmittag Projekt.

Kann sein, ich bin Scherz, aber wenn yacc ist weniger komplex als Rubin dann könnte man yacc in Baumwipfel realisieren, die als Anwendungen der Rubin Grammatik für yacc erstellt.

Für Ihre Zwecke, können Sie wahrscheinlich weg, ohne alle Ruby-Parsing. Was Sie wirklich brauchen, ist ein Weg, um die% zu erkennen,> dass abschliesst ein Ruby-Block. Wenn Sie nicht immer wollen scheitern, wenn der Ruby-Code, diese Schließung Zeichen enthält, müssen Sie erkennen, überall die Zeichen innerhalb des Ruby-Text auftreten können; was bedeutet, müssen Sie alle Formen von Literalen erkennen.

Doch für Sie Zwecke können Sie wahrscheinlich mit der Anerkennung des am wahrscheinlichsten Fall weg, wo%> in Ruby Text auftreten würde, und ignorieren nur die Fälle. Dies setzt voraus, natürlich, dass ein verbleibender Fehler kann, indem sie Ihre Benutzer behandelt werden, um die ERB ein wenig anders zu schreiben.

Für das, was es wert ist, Treetop selbst „Parsen“ Ruby-Blöcke auf diese Weise; es nur zählt {und} bis zum Abschluss einer gefunden wird. Also, wenn Ihr Block enthält a} in einer Zeichenkette, bist du kaputt (aber Sie können, indem das passende eines in einem Kommentar umgehen).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top