1

私は小さな、本当に単純な Lisp パーサーを ruby​​ で書いて、treetop gem を試してみました。しかし、それは私が望むようにうまく機能していません.ドキュメントはかなり貧弱であるため、私が間違っていることを理解するのは困難です. 現在、文法は記号とブール値の両方に一致しますが、数値には一致しません。ただし、アトム ルールの順序を、たとえば bool / number / symbol に切り替えると、最初の 2 つには一致しますが、最後の 1 つには一致しません。ツリートップ ジェムには、1 つのルールで 2 つのオプションしか持てないという制限はありますか? また、「(3)」のようなものはまだ解析されません。

私の文法は次のとおりです。

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

チュートリアルで示したように、次のようにテストしています。

parser = LispParser.new
if parser.parse('T')
  puts "Success"
else
  puts "Fail"
end
4

1 に答える 1

1

ルールを定義した方法numbersymbolそれらは常に一致します ( *「ゼロ以上」を意味し、常に何かのゼロを見つけることができるため)。これは、「42」を解析しようとすると、パーサーは最初symbolに空の文字列に対してルールを正常に照合し、それ以上の入力を期待しないことを意味します。

これを修正するには、単に に置き換え*ます+

于 2010-09-17T03:20:08.717 に答える