2011-01-26 19 views
1

可能であれば、Javaスキャナを使用してdice notationの再帰的な降下構文解析実装を構築したいと考えています。私は以前にa question about itを開いたことがありますが、私の要求があまりに単純化されているようでした。そこで、私はここでその要求をグローバルに提示しています。ダイス表記(再帰的降下構文解析の実装):デリミタのないスキャナ

これはクラスjava.util.Scannerで実現可能ですが、必要に応じて自分のスキャナを作成します。私は今これを避けたいと思います。

expression = { whitespace } , [ plusminus ] , roll , { plusminus , (roll | number , { whitespace }) } ; 
roll   = [ number ] , ("d" | "D") , (number | "%") , [ "-" ("L" | "H") ] , { whitespace } ; 
plusminus = ("+" | "-") , { whitespace } ; 
number  = nonzerodigit , { digit } ; 
digit  = nonzero digit | "0" ; 
nonzerodigit = "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ; 
whitespace = ? Java definition of a whitespace ? ; 

だから、実際に、私は次のコードを記述しようとしました:

Scanner s = new Scanner("1d6"); 
if (s.hasNextInt()) { 
    s.nextInt(); 
} else { 
    throw new java.text.ParseException(); 
} 

をしかし、明らかにそれが失敗し続けています。

また、前の質問で示唆したように、私はfindWithinHorizo​​nメソッドを試しましたが、実際に次のパターンを見つけて、どこから来たのかはチェックしません。だから、もし私が必要なものでないなら、文字列を "プッシュバック"することはできません...

このコンテキストでjava.util.Scannerをどのように使うべきですか?あるいは私自身のスキャナを書く必要がありますか?

答えて

3

java.util.Scannerは使用しないでください。 JParsecのデザインを見てください。

+0

JParsecに関するヒントをありがとう。私はそのデザインを使うつもりだと思うし、あまりに時間がかかってしまったら、私はその図書館自体を使うだろう。しかし、なぜ私はスキャナを使用すべきではないのか説明できますか?より良い選択肢(JParsecのような)やその他の理由があるので、その目的ではないからですか? –

+0

あなたの文法は、このScannerのものとはまったく異なっています。 –

+0

ありがとう、ありがとう! –

1

文法を使用する場合は、ANTLRを使用してください。これはパーサジェネレータです。文法から、パーサを簡単に生成し、このクラスを使用して式を解析することができます。

+0

いいえ、私はそれが私の手で行われたいので、パーサーが実際にどのように動作するかを学びます。だから私は明示的に "再帰的な下位解析実装"括弧をタイトルに指定したのです。 –

関連する問題