Treetop Rubin Parser - konnte nicht Parse Bestellte Wahl
Frage
Ich habe einfache Grammatik definiert für das Parsen von String und Nummer mit Treetop wie unten.
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 zurück String node , aber aussehen wie die Parser konnte nicht verstehen, die Eingabe. Jede Idee, würde geschätzt.
Lösung
In Treetop (und PEGs im Allgemeinen, tatsächlich) die Wahl Operator bestellt , im Gegensatz zu den meisten anderen Parsing Formalismen.
Also,
rule value
number / string
end
Sie Treetop sagen, dass Sie bevorzugen number
über string
.
Ihre Eingabe beginnt mit 1
, die Streichhölzer beide number
und string
(durch word
), aber Sie Treetop sagte der number
Interpretation bevorzugen, so dass er es als number
analysiert. Wenn es um die a
im Eingang kommt, ist es nicht mehr Regeln hat gelten, und somit gibt es nichts (nil
), weil in Treetop es ein Fehler ist nicht den gesamten Eingangsstrom verbrauchen.
Wenn Sie einfach die Reihenfolge der Wahl umkehren, wird der gesamte Eingang als string
anstelle eines number
interpretiert:
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 könnten Sie die Reihenfolge halten, wie es ist, aber der value
Regel erlauben, 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 geben grob wie folgt aus:
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"