Анализатор диапазона покерных рук ... как мне написать грамматику? - PullRequest
3 голосов
/ 14 июля 2010

Я хотел бы создать анализатор диапазона рук в покере, в котором я могу предоставить строку, такую ​​как следующее (допустим, стандартная колода из 52 карт, ранги 2-A, s = подходит, o = подходит):

"22+,A2s+,AKo-ATo,7d6d"

Анализатор должен иметь возможность создавать следующие комбинации:

6 combinations for each of 22, 33, 44, 55, 66, 77, 88, 99, TT, JJ, KK, QQ, AA
4 combinations for each of A2s, A3s, A4s, A5s, A6s, A7s, A8s, A9s, ATs, AJs, AQs, AKs
12 combinations for each of ATo, AJo, AQo, AKo
1 combination of 7(diamonds)6(diamonds)

Я думаю, что знаю части грамматики, но не все:

NM+ --> NM, N[M+1], ... ,N[N-1]
NN+ --> NN, [N+1][N+1], ... ,TT where T is the top rank of the deck (e.g. Ace)
NP - NM --> NM, N[M+1], ... ,NP
MM - NN --> NN, [N+1][N+1], ..., MM

Я не знаю выражения для грамматики для обозначения соответствия.

Я новичок в программировании, так что прости этот основной вопрос: это проблема индукции грамматики или проблема с синтаксическим анализом?

Спасибо

Mike

1 Ответ

3 голосов
/ 14 июля 2010

Что ж, вам, вероятно, стоит взглянуть на EBNF, чтобы показать свою грамматику в общепринятой манере.

Я думаю, это будет выглядеть примерно так:

S = Combination { ',' Combination } .
Combination = Hand ['+' | '-' Hand] . 
Hand = Card Card ["s" | "o"] .
Card = rank [ color ] .

Где {} означает 0 илибольше вхождений, [] означает 0 или 1 вхождение и |означает либо то, что осталось от |или что справа от |.

Таким образом, в основном, это сводится к начальному символу (S), который говорит, что парсер должен обрабатывать от 1 до любого числа комбинаций, которые все разделены ",".

Эти комбинации состоят из описания карты и затем либо "+", "-" и другого описания карты, либо ничего.

Описание карты состоит из ранга и, необязательно,цвет (лопаты, сердечки и т. д.).Тот факт, что ранг и цвет не пишутся с заглавной буквы, показывает, что они не могут быть далее разделены на части (что делает их терминальным классом).

Мой пример не предоставляет возможности для использования в комплекте / свитах, и это главным образом потому, что в ваших примерах один раз, когда операции выполняются в самом конце "AK-ATo" и один раз в середине "A2s +».

Являются ли эти примеры вашим собственным творением или они даны вам из внешнего источника (читай: вы не можете их изменить)?

Если вы можете изменить их, я настоятельно рекомендую расположить их в одной указанной позиции комбинации (например, в конце), чтобы упростить создание грамматики и, в конечном счете, синтаксический анализ.

...