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 回答