2010-12-22 7 views
1

Ich habe eine einfache Grammatik definiert, um String und Zahl mit Hilfe von Treetop wie unten zu analysieren.Treetop-Rubin-Parser - konnte nicht sortiert werden Ordered Choice

grammar Simple 
    rule value 
     number/string 
    end 

    rule string 
     word space string 
     /
     word 
    end 

    rule word 
     [0-9a-zA-Z]+ 
    end 

    rule number 
     [1-9] [0-9]* 
    end 

    rule space 
     ' '+ 
    end 
end 

Rubin:

parser = SimpleParser.new 
parser.parse('123abc wer') # => nil 

Ich erwarte, dass der Parser String Knoten sondern sehen aus wie der Parser nicht zurückkehren die Eingabe verstehen konnte. Irgendeine Idee würde geschätzt werden.

Antwort

4

In Treetop (und PEGs im Allgemeinen, eigentlich) ist der Wahloperator geordnete, im Gegensatz zu den meisten anderen Parsing Formalismen.

Also, in

rule value 
    number/string 
end 

Sie Treetop sagen, dass Sienumber über string bevorzugen .

Ihre Eingabe beginnt mit 1, die passt sowohlnumber und string (durch word), aber Sie Treetop sagte der number Interpretation bevorzugen, so dass er es als number analysiert. Wenn es in der Eingabe zu der aa kommt, hat es keine Regeln mehr zu gelten und daher gibt es nichts (nil) zurück, da es in Treetop ein Fehler ist, den gesamten Eingabestream nicht zu verbrauchen.

SyntaxNode+String0 offset=0, "123abc wer" (word,space,string): 
    SyntaxNode offset=0, "123abc": 
    SyntaxNode offset=0, "1" 
    SyntaxNode offset=1, "2" 
    SyntaxNode offset=2, "3" 
    SyntaxNode offset=3, "a" 
    SyntaxNode offset=4, "b" 
    SyntaxNode offset=5, "c" 
    SyntaxNode offset=6, " ": 
    SyntaxNode offset=6, " " 
    SyntaxNode offset=7, "wer": 
    SyntaxNode offset=7, "w" 
    SyntaxNode offset=8, "e" 
    SyntaxNode offset=9, "r" 

Oder Sie den Auftrag halten konnte, wie es ist, aber erlauben, die value Regel:

Wenn Sie einfach die Reihenfolge der Wahl umkehren, wird der gesamte Eingang als string anstelle eines number interpretiert mehrfach angepasst werden. Entweder legen Sie eine neue Top-Level-Regel wie folgt aus:

rule values 
    value+ 
end 

oder ändern Sie die value Regel wie folgt aus:

rule value 
    (number/string)+ 
end 

, die Ihnen eine AST gibt ungefähr so:

SyntaxNode offset=0, "123abc wer": 
    SyntaxNode+Number0 offset=0, "123": 
    SyntaxNode offset=0, "1" 
    SyntaxNode offset=1, "23": 
     SyntaxNode offset=1, "2" 
     SyntaxNode offset=2, "3" 
     SyntaxNode+String0 offset=3, "abc wer" (word,space,string): 
     SyntaxNode offset=3, "abc": 
      SyntaxNode offset=3, "a" 
      SyntaxNode offset=4, "b" 
     SyntaxNode offset=5, "c" 
    SyntaxNode offset=6, " ": 
     SyntaxNode offset=6, " " 
    SyntaxNode offset=7, "wer": 
     SyntaxNode offset=7, "w" 
     SyntaxNode offset=8, "e" 
     SyntaxNode offset=9, "r" 
+0

Dank Jörg, Ja, Sie haben Recht. Ich bevorzuge es, die Zahl in der Wertregel der Zeichenfolge zuzuordnen. Und wie könnte ich "zulassen, dass die Wertregel mehrfach angepasst wird"? So funktioniert das obige Beispiel – lchanmann

+0

@mann: Die Wiederholungsoperatoren in Treetop sind '+' und '*' mit ähnlicher Bedeutung wie in 'Regexp'. Siehe die Bearbeitung für Details. –

+0

@Clifford auf Treetop-Entwicklung Google-Gruppe vorschlagen, "!." um EOF anzupassen, also nach dem Ändern der Nummernregel zu "[1-9] [0-9]!." Jetzt kann ich sowohl die Zahl als auch die Saite perfekt abgleichen. Danke Jörg! – lchanmann