可能であれば、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();
}
をしかし、明らかにそれが失敗し続けています。
また、前の質問で示唆したように、私はfindWithinHorizonメソッドを試しましたが、実際に次のパターンを見つけて、どこから来たのかはチェックしません。だから、もし私が必要なものでないなら、文字列を "プッシュバック"することはできません...
このコンテキストでjava.util.Scannerをどのように使うべきですか?あるいは私自身のスキャナを書く必要がありますか?
JParsecに関するヒントをありがとう。私はそのデザインを使うつもりだと思うし、あまりに時間がかかってしまったら、私はその図書館自体を使うだろう。しかし、なぜ私はスキャナを使用すべきではないのか説明できますか?より良い選択肢(JParsecのような)やその他の理由があるので、その目的ではないからですか? –
あなたの文法は、このScannerのものとはまったく異なっています。 –
ありがとう、ありがとう! –