Обозначение игральных костей (реализация анализа рекурсивного спуска): сканер без разделителя - PullRequest
1 голос
/ 26 января 2011

Я хотел бы построить реализацию синтаксического анализа рекурсивного спуска для нотации в кости , если возможно, используя java-сканер. Ранее я задавал вопрос об этом , но казалось, что мои требования слишком упрощены. Итак, я представляю здесь запрос в его глобальности.

Я действительно надеюсь, что это возможно с классом 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 в этом контексте? Или, может быть, я должен написать свой собственный сканер?

Ответы [ 2 ]

3 голосов
/ 26 января 2011

Вы не должны использовать java.util.Scanner. Посмотрите на дизайн JParsec .

1 голос
/ 26 января 2011

Для работы с грамматиками следует использовать ANTLR .Это генератор парсера.Из вашей грамматики вы сможете легко сгенерировать парсер и использовать этот класс для разбора вашего выражения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...