2011-01-26 2 views
1

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

ответ

3

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

+0

Спасибо за отзыв о JParsec. Я думаю, что я буду использовать его дизайн, или если потребуется слишком много времени, я буду использовать библиотеку. Однако вы можете объяснить, почему я не должен использовать сканер? Это потому, что это не его цель, потому что есть лучшие альтернативы (например, JParsec) или по любой другой причине? –

+0

Ваша грамматика слишком отличается от того, для чего предназначена эта программа сканера. –

+0

Хорошо, спасибо вам большое! –

1

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

+0

Нет, я хочу, чтобы это делалось с моими руками, поэтому я узнаю, как работает парсер. Вот почему я явно указал в скобках «рекурсивный разбор синтаксического разбора» в названии. –

Смежные вопросы