Domanda

Sto scrivendo un piccolo, molto semplice parser Lisp in rubino con la gemma cima d'albero appena a sperimentare con esso. Tuttavia, non è davvero lavorando come voglio che, e la documentazione è piuttosto scarsa, quindi è difficile capire che cosa sto facendo male. Attualmente, la grammatica può abbinare sia un simbolo e un valore booleano, ma non un numero. Tuttavia, quando passo l'ordine nella regola atomo, ad esempio per bool / numero / simbolo, corrisponde ancora per i primi due, ma non l'ultimo. C'è una limitazione nel gemma cime degli alberi che significa che è possibile avere solo due opzioni in una regola? Inoltre, qualcosa di simile a '(3)' ancora non analizza.

La mia grammatica è la seguente:

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

sto testando come hanno mostrato nel tutorial, con:

parser = LispParser.new
if parser.parse('T')
  puts "Success"
else
  puts "Fail"
end
È stato utile?

Soluzione

Il modo in cui si è definito le regole number e symbol hanno sempre corrisponde (perché significa * "zero o più" e si può sempre trovare qualcosa di zero). Questo significa che se si tenta di analizzare "42", il parser prime partite con successo la regola symbol contro la stringa vuota all'inizio e poi si aspettano non fare altre operazioni.

Per risolvere il * sostituire semplicemente con +.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top