В настоящее время я работаю над анализатором истории покерных рук в рамках своего бакалаврского проекта. За последние пару дней я провел небольшое исследование и наткнулся на несколько хороших генераторов парсеров (из которых я выбрал JavaCC, поскольку сам проект будет написан на Java).
Несмотря на то, что грамматика истории рук довольно проста и понятна, существует проблема неоднозначности из-за разрешенного набора символов в нике игрока.
Предположим, у нас есть строка следующего формата:
Seat 5: myNickname (1500 in chips)
Токен myNickname
может содержать любой символ, а также пробелы. Это означает, что и (1500 in chip
, и Seat 5:
являются действительными псевдонимами, что в конечном итоге приводит к проблеме двусмысленности. Никаких ограничений по нику игрока нет, кроме длины (4-12 символов).
Мне нужно проанализировать и сохранить несколько данных вместе с ником игрока (например, положение места и количество фишек в данном конкретном случае), поэтому мой вопрос: какие у меня здесь варианты?
Я бы хотел сделать это с помощью JavaCC, что-то вроде этого:
SeatRecord seat() :
{ Token seatPos, nickname, chipStack; }
{
"Seat" seatPos=<INTEGER> ":" nickname=<NICKNAME> "(" chipStack=<INTEGER>
"in chips)"
{
return new SeatRecord(seatPos.image, nickname.image, chipStack.image);
}
}
Что прямо сейчас не работает (из-за указанной проблемы)
Я также искал парсеры GLR (которые, по-видимому, обрабатывают неоднозначные грамматики), но в основном они кажутся заброшенными или плохо документированными, за исключением Bison, но он не поддерживает парсеры GLR для Java и может быть слишком сложным для работы с в любом случае (помимо проблемы двусмысленности, как я уже упоминал, сама грамматика довольно проста)
Или я должен сам придерживаться токенизации строки и использовать indexOf(), lastIndexOf()
и т. Д. Для анализа нужных мне данных? Я бы пошел на это, только если бы это был единственный оставшийся вариант, так как это было бы слишком уродливо ИМХО, и я мог бы пропустить некоторые случаи (что привело бы к неправильному синтаксическому анализу)