1

可能であれば、Java Scanner を使用してサイコロ表記の再帰降下解析実装を構築したいと考えています。私は以前にそれについて質問をしましたが、要件が単純化しすぎているようでした。だから私はここで、そのグローバル性における要求を提示しています。

これが 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 を使用する方法について何か提案はありますか? それとも、独自のスキャナーを作成する必要がありますか?

4

2 に答える 2

3

java.util.Scanner は使用しないでください。JParsecの設計を見てみましょう。

于 2011-01-26T12:23:33.553 に答える
1

文法を扱うには、ANTLRを使用する必要があります。パーサージェネレーターです。文法から簡単にパーサーを生成し、このクラスを使用して式を解析できます。

于 2011-01-26T12:35:45.537 に答える