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
War es hilfreich?

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.

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