Frage

Ich versuche, mich Treetop Grammatik Generator Ruby zu lehren. Ich finde, dass nicht nur die Dokumentation woefully spärlich für die „beste“ gibt, aber dass es scheint nicht so intuitiv zu arbeiten, wie ich gehofft hatte.

Auf einem hohen Niveau, ich würde wirklich gerne ein besseres Tutorial als die Vor-Ort-docs oder das Video, wenn es einen gibt.

Auf einer unteren Ebene, hier ist eine Grammatik kann ich überhaupt nicht an der Arbeit:

grammar SimpleTest

  rule num
    (float / integer)
  end

  rule float
   (
    (( '+' / '-')? plain_digits '.' plain_digits) /
    (( '+' / '-')? plain_digits ('E' / 'e') plain_digits ) /
    (( '+' / '-')? plain_digits '.') / 
    (( '+' / '-')? '.' plain_digits) 
   ) {
      def eval
        text_value.to_f
      end
   }
  end

  rule integer
    (( '+' / '-' )? plain_digits) {
      def eval
        text_value.to_i
      end
    }
  end

  rule plain_digits
    [0-9] [0-9]*      
  end

end

Wenn ich es laden und einige Behauptungen in einem sehr einfachen Testobjekt laufen, finde ich:

assert_equal @parser.parse('3.14').eval,3.14

Adaequat, während

assert_equal @parser.parse('3').eval,3

hebt den Fehler: NoMethodError: private Methode `eval‘ genannt für #

Wenn ich integer umkehren und schwimmen auf der Beschreibung, beide ganze Zahlen und Schwimmer geben Sie mir diesen Fehler. Ich denke, dies zu begrenztem Look-Ahead in Zusammenhang stehen kann, aber ich kann keine Informationen in eines der Dokumente finden, um auch die Idee der Auswertung in dem „oder“ Kontext abdecken

Ein bisschen mehr Informationen, die helfen können. Hier pp Informationen für sowohl die Parse () blockiert.

Der Schwimmer:

SyntaxNode+Float4+Float0 offset=0, "3.14" (eval,plain_digits):
  SyntaxNode offset=0, ""
  SyntaxNode+PlainDigits0 offset=0, "3":
    SyntaxNode offset=0, "3"
    SyntaxNode offset=1, ""
  SyntaxNode offset=1, "."
  SyntaxNode+PlainDigits0 offset=2, "14":
    SyntaxNode offset=2, "1"
    SyntaxNode offset=3, "4":
      SyntaxNode offset=3, "4"

Die Integer ... beachten Sie, dass es scheint, definiert wurden, um die Integer-Regel zu folgen, aber nicht die eval () -Methode gefangen:

SyntaxNode+Integer0 offset=0, "3" (plain_digits):
  SyntaxNode offset=0, ""
  SyntaxNode+PlainDigits0 offset=0, "3":
    SyntaxNode offset=0, "3"
    SyntaxNode offset=1, ""

Update:

Ich habe mein besonderes Problem zu arbeiten, aber ich habe keine Ahnung, warum:

  rule integer
    ( '+' / '-' )? plain_digits
     {
      def eval
        text_value.to_i
      end
    }
  end

Das macht keinen Sinn mit der Dokumentation, die vorhanden sind, aber das Entfernen nur die zusätzlichen Klammern das Spiel gehören die Ganzzahl1 Klasse sowie Integer0 gemacht. Ganzzahl1 ist offenbar die Klasse die eval () -Methode zu halten. Ich habe keine Ahnung, warum dies der Fall ist.

Ich bin immer noch für weitere Informationen über Baumwipfel suchen.

War es hilfreich?

Lösung

Leider saugt Treetop-Dokumentation. Viel. Und die Beispiele auf der Website sind nicht hilfreich. Ich fand, dass dzone eine ziemlich große Sammlung von Baumwipfel Grammatiken hat:

Treetop Grammatiken

Andere Tipps

Sie können Paul Battley ist schön, einfaches Tutorial schätzen an Erste Schritte mit Treetop

mit einer minimalen Grammatik starten, er zeigt, wie ein Parser erstellen und dann durch ein paar Iterationen fügt nur ein wenig Funktionalität. Es war gerade genug, um mich aus den Startlöchern zu erhalten.

gab Roland Swingler einen Vortrag über Baumwipfel LRUG: http://skillsmatter.com/podcast/ajax-ria/treetop dass ich nützlich getting started gefunden.

Citrus ist eine viel leichtere Alternative zu Wipfel: http://github.com/mjijackson/citrus

Ich folgte diesem Treetop Einführungs Tutorial ein paar Jahren die Grundlagen der Baumwipfel zu verstehen.

Und dann Eine kurze Einführung zu Schreiben mir einen Parser mit Treetop , nützlich, weil es erklärt, wie Syntax-Baum-Knoten zuordnen Klasseninstanzen ruby.

Ich habe gerade angefangen mit TreeTop experimentieren.

Ich habe versucht, das zu ändern

 rule num
      (float / integer)
 end

 rule num
      (float / integer)
      {
       def eval
            text_value.to_f
       end
      }
 end

Und es scheint zu funktionieren.

Die Treetop docs zu übernehmen scheinen Sie schon eine ganze Menge wissen über Ausdrucksanalyse Grammatiken (PEGs). Treetop basiert vollständig auf PEGs. PEGs sind größer als nur obwohl Baumwipfel, das heißt, sie in anderen Parsen Bibliotheken als auch verwendet werden. Beim Lernen Treetop, fand ich es sehr hilfreich, auf PEGs im Allgemeinen zu studieren. Das half in vielen der Lücken in der Dokumentation zu füllen.

Das ist ein Fehler. Die unnötigen Klammern um die Regel für eine ganze Zahl verursachen Bau eines zusätzlichen Moduls die Definition von eval zu enthalten, und dieses Modul nicht gemischt bekommt in den Knoten, so ‚eval‘ nicht zur Verfügung steht. Sie können dies deutlich sehen, ob Sie den Ruby-Code (erzeugt mit dem tt-Befehl) für die Versionen mit und ohne diese zusätzliche Klammern vergleichen.

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