Каковы некоторые экзотические методы разбора? - PullRequest
4 голосов
/ 02 июня 2009

Я разбирал истории покерных рук за последний год и узнал довольно много о разборе в целом.

Мы начали с регулярных выражений, но быстро поняли, что это будет нелегко масштабировать. Мы пропустили языки от ruby ​​до c ++ и, наконец, поняли, что именно алгоритм должен был измениться.

Мы взяли Boost :: Spirit и наблюдали, как наша скорость резко возрастает на порядки, в 10 раз превышающие нашу первоначальную скорость. Затем мы перешли на java и в настоящее время используем antlr для создания грамматик для каждого сайта. Это, безусловно, самый быстрый метод, и он очень тщательный, и это хорошо, потому что вы точно знаете, где находитесь с точки зрения «полной» грамматики. К сожалению, я потратил невероятное количество времени на работу с этими грамматиками - они работают чертовски хорошо, но пока не идеально.

Во всяком случае, хватит с подоплекой вопроса под рукой - есть ли какие-нибудь «экзотические» или менее известные методы анализа, о которых я не знаю? Я знаю только о лексизировании / разборе грамматики и другом низком методе регулярных выражений / циклов.

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

Full Tilt Poker Game #12037626529: Table durrrr (heads up, deep) - $500/$1000 -
Pot Limit Omaha Hi - 2:00:48 ET - 2009/05/05
Seat 1: durrrr ($196,456.50)
Seat 2: Gus Hansen ($65,499)
durrrr posts the small blind of $500
Gus Hansen posts the big blind of $1,000
The button is in seat #1
*** HOLE CARDS ***
durrrr raises to $3,000
Gus Hansen raises to $9,000
durrrr calls $6,000
*** FLOP *** [3d 4d 7d]
Gus Hansen has 15 seconds left to act
Gus Hansen checks
durrrr checks
*** TURN *** [3d 4d 7d] [Jh]
Gus Hansen checks
durrrr checks
*** RIVER *** [3d 4d 7d Jh] [Ah]
Gus Hansen has 15 seconds left to act
Gus Hansen checks
durrrr has 15 seconds left to act
123stayfree (Observer): GUS I NOW BRING U LUCK
durrrr bets $7,600
Gus Hansen has 15 seconds left to act
Gus Hansen has requested TIME
Hernandez777 (Observer): Gus has the super-duper nuts
Gus Hansen calls $7,600
Podobed45 (Observer): fluuuuuuuuuush
*** SHOW DOWN ***
durrrr shows [Kc 3s Qd As] two pair, Aces and Threes
Gus Hansen mucks
durrrr wins the pot ($33,199.50) with two pair, Aces and Threes
*** SUMMARY ***
Total pot $33,200 | Rake $0.50
Board: [3d 4d 7d Jh Ah]
Seat 1: durrrr (small blind) collected ($33,199.50)
Seat 2: Gus Hansen (big blind) mucked

Я хорошо знаю о других методах сбора информации (таких как очистка экрана и инъекция DLL), но необходимость преобразования истории рук в структурированные данные все еще существует, поэтому я смотрю только на методы, которые собирают информацию. информация, такая как регулярные выражения / грамматики ...

Я думаю, что если я не найду что-то, я собираюсь переписать наши грамматики с помощью ocamllex / ocamlyacc.

обновление

fyi: скорость регулярного выражения составляла ~ 60 рук / сек, в то время как грамматики обрабатывали 600+ рук / сек ... вся рука преобразуется в xml после того, как все данные отсортированы ... существует от 20 до 30 регулярных выражений необходим (по последнему счету) для КАЖДОГО сайта, который вы хотите проанализировать .... у каждого сайта на стороне грамматики есть своя собственная грамматика с безбожным количеством правил лексера / синтаксического анализатора (но это все же меньший размер кода)

У меня есть книга драконов, и я ее читаю - что подстегнуло мой интерес к использованию ocamllex / ocamlyacc .... скорость - это название игры здесь ..

Ответы [ 8 ]

5 голосов
/ 02 июня 2009

Поскольку вы ищете экзотику, прочитайте эту статью о приоритете оператора Вогана Пратта сверху вниз ...

http://javascript.crockford.com/tdop/tdop.html

4 голосов
/ 02 июня 2009

Парсер комбинаторы - очень популярный метод построения парсеров на функциональных языках, таких как Haskell.

3 голосов
/ 02 июня 2009

Если вы хотите увеличить скорость, вам лучше использовать OcamlYacc / FsYacc поверх ANTLR. OcamlYacc создает парсеры LL (1), которые обычно имеют лучшую производительность, чем парсеры LL (*) в стиле ANTLR (кто-то может исправить меня, если я ошибаюсь). [Изменить, чтобы добавить:] Взгляды как кто-то исправил меня: OCamlYacc создает парсеры LALR (1). Я не могу с уверенностью сказать, быстрее ли парсеры OcamlYacc, чем парсеры ANTLR.

OCaml / F # - очень хорошие языки для построения DSL, и, на мой взгляд, гораздо более подходящие для работы, чем Java, в основном потому, что его смехотворно легко создавать и обходить AST, представленный в виде структуры данных объединения. Я рекомендовал этот учебник , который демонстрирует, как анализировать SQL в F #.

2 голосов
/ 12 июня 2009

Вы должны спросить себя, действительно ли вы хотите поиграть с парсерами (по общему признанию, забавно, и что я предпочитаю сам) или хотите ли вы на самом деле выполнить работу над своим покерным ботом. Скорее всего, экзотические методы разбора излишни для того, что вам нужно. Просто выберите быстрый язык с простыми и удобными синтаксическими анализаторами. Вероятно, вы должны быть в состоянии обработать 10k рук / сек с прямым C + flex. Или ocamllex + ocamlyacc должно быть более чем достаточно. Если вам придется изменить ваш код, я думаю, вы делаете что-то не так. Задержка в сети должна стать вашим настоящим узким местом, а не парсингом. На какой машине это работает?

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

В среднем для данной грамматики эквивалентной мощности LL будет медленнее, чем LALR. В частности, если покерные руки действительно анализируются LALR-парсером, то bison / byacc + flex каждый раз побьет ANTLR-руки. Лично я очень доволен менгиром, хотя это свирепая сучка, чтобы работать с godi + ocamlbuild.

- Нико

1 голос
/ 06 июня 2009

Поскольку вы говорите об использовании OCaml для синтаксического анализа, на этой странице представлен обзор различных вариантов синтаксического анализа для этого языка:

Генераторы парсеров для языка OCaml

Если вы решите согласиться на ocamlyacc (или menhir), эти учебники могут быть немного проще, чем справочное руководство:

1 голос
/ 02 июня 2009

Разбор рекурсивного спуска может работать на вас. Это очень настраиваемый. Это может быть немного медленнее, чем yacc / antlr, но может быть достаточно быстрым. Основная идея: вы кодируете каждое грамматическое правило как функцию.

1 голос
/ 02 июня 2009

В Википедии есть хороший обзор типов парсеров, здесь: http://en.wikipedia.org/wiki/Parser

И сравнение инструментов генератора парсеров здесь: http://en.wikipedia.org/wiki/Comparison_of_parser_generators

Я думаю, GLR - это своего рода менее известный метод, который интересен тем, что имеет дело с неоднозначностями языка.

1 голос
/ 02 июня 2009

Прочитайте Книгу Дракона: http://www.amazon.com/Compilers-Principles-Techniques-Alfred-Aho/dp/0201100886

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

...