Я хотел бы построить рекурсивную синтаксическую разборку спуска с помощью сканера java, если это возможно. Я ранее открывал 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) или по любой другой причине? –
Ваша грамматика слишком отличается от того, для чего предназначена эта программа сканера. –
Хорошо, спасибо вам большое! –