jsonStr ~ (":" ~> jsonVal) ^^ { case x ~ y => (x, y) }
Самое любопытное, что после нескольких минут изучения читать эту галиматью становится легко и удобно.
В принципе, дописал, но надо бы еще добавить вот это:
vpri.org
если дойдут руки, будет вообще дико круто, потому что такой packrat-парсер будет покрывать практически все полезные на практике грамматики.
Весь кодогенератор — 300 строк.(для ср. — в том же Rats! кодогенератор это примерно 4000 строк жабокода, что есьм просто ад и кровавый понос)
также, уже написан упрощатель грамматики(трансформации продукций выбора с приоритетом и последовательностей и пр.), и некоторые оптимизаторы.
над оптимизаторами надо еще подумать, наверное. сейчас есть оптимизации по чанкам, как в rats! и виртуальный инлайнинг продукций(реальный нахрен не нужен потому что код собирается в labels, и лисповый компилятор и так отлично инлайнит то что можно).
вообще, получилось довольно клево, и работает довольно быстро(в SBCL). компилируется не так быстро, правда, как хотелось бы.
над чем надо думать еще, кроме вышеописанного, так это над некоторым DSL, встроенным в грамматики. Я так думаю, что-нибудь чисто функциональное туда запилить, может лисп, может что попроще, может даже с выводом типов. Это будет полезно потому что генератор парсеров поддерживает семантические предикаты и семантические действия, ну и, естественно, потому, что, визуализатору по идее нужно поставлять AST, а не дерево разбора, а его надо как-то строить.
$ wc testparser.sh
2 11 8371 testparser.sh
8КБайт! :-(
gist.github.com обновил йоба-парсер.
Matthew Might, David Darais
(Submitted on 24 Oct 2010)
We present two novel approaches to parsing context-free languages. The first approach is based on an extension of Brzozowski's derivative from regular expressions to context-free grammars. The second approach is based on a generalization of the derivative to parser combinators. The payoff of these techniques is a small (less than 250 lines of code), easy-to-implement parsing library capable of parsing arbitrary context-free grammars into lazy parse forests. Implementations for both Scala and Haskell are provided. Preliminary experiments with S-Expressions parsed millions of tokens per second, which suggests this technique is efficient enough for use in practice.