Problem mit Baumwipfel Grammatik übereinstimmt, nicht alle Optionen
Frage
Ich schreibe einen kleinen, ganz einfach Lisp-Parser in Ruby mit dem Wipfel Juwel einfach damit zu experimentieren. Allerdings ist es nicht wirklich funktioniert, wie ich es will, und die Dokumentation ist ziemlich schlecht, so dass es schwer zu verstehen ist, was ich falsch mache. Derzeit kann die Grammatik sowohl ein Symbol entsprechen und einen boolean, aber keine Zahl. Allerdings, wenn ich die Reihenfolge, in der Atom Regel wechseln, zum Beispiel Bool / Anzahl / Symbol, es passt immer noch für die ersten beiden, aber nicht das letzte. Gibt es eine Begrenzung des Baumwipfel Juwel, dass Mittel nur zwei Optionen in der Regel haben kann? Auch so etwas wie ‚(3)‘ immer noch nicht analysieren.
Meine Grammatik ist wie folgt:
grammar Lisp
rule expression
atom / list
end
rule atom
symbol / bool / number
end
rule number
[0-9]*
end
rule bool
'T' / 'F'
end
rule symbol
[a-zA-Z]*
end
rule list
'(' expression* ')'
end
end
Ich teste es, wie sie im Tutorial gezeigt, mit:
parser = LispParser.new
if parser.parse('T')
puts "Success"
else
puts "Fail"
end
Lösung
Die Art und Weise Sie die Regeln definiert number
und symbol
sie passen immer (weil *
bedeutet „Null oder mehr“ und Sie können immer Null von etwas finden). Dies bedeutet, dass, wenn Sie versuchen, „42“ zu analysieren, der Parser zuerst erfolgreich die Regel symbol
gegen die leere Zeichenkette am Anfang übereinstimmt und dann keine weitere Eingabe erwartet.
Dieses einfach ersetzen *
mit +
beheben.