Обозначение игральной кости (рекурсивная реализация синтаксического анализа спуска): сканер без разделителя

Я хотел бы создать реализацию синтаксического анализа рекурсивного спуска для нотации игры в кости с использованием 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();
 }

Но очевидно, что он продолжает терпеть неудачу.

Также, как было предложено в предыдущем вопросе, я пробовал методы findWithinHorizon, но он действительно находит следующий шаблон и не проверяет, где я нахожусь. Поэтому я не могу "оттолкнуть" строку, если это не то, что мне нужно...

Так что любое предложение о том, как я должен использовать java.util.Scanner в этом контексте? Или, может быть, мне нужно написать свой собственный сканер?


person Olivier Grégoire    schedule 26.01.2011    source источник


Ответы (2)


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

person SK-logic    schedule 26.01.2011
comment
Спасибо за совет о JParsec. Думаю, воспользуюсь ее дизайном, или, если это займет слишком много времени, воспользуюсь самой библиотекой. Однако вы можете объяснить, почему я не должен использовать Scanner? Это потому, что это не его цель, потому что есть лучшие альтернативы (например, JParsec) или по какой-то другой причине? - person Olivier Grégoire; 26.01.2011
comment
Ваша грамматика слишком отличается от того, для чего предназначен этот Сканер. - person SK-logic; 26.01.2011

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

person Valentin Rocher    schedule 26.01.2011
comment
Нет, я хочу, чтобы это было сделано моими руками, поэтому я узнаю, как на самом деле работает парсер. Вот почему я явно указал в заголовке круглую скобку реализации синтаксического анализа рекурсивного спуска. - person Olivier Grégoire; 26.01.2011