Я пытаюсь создать комбинаторы парсеров, следуя Хаттону и Мейеру, «Монадные парсер-комбинаторы».Моя реализация написана на PostScript, но я думаю, что моя проблема заключается в общих синтаксических анализаторах, а не в конкретной реализации.
В качестве небольшого упражнения я использую синтаксические анализаторы для распознавания регулярных выражений.
(pc9.ps)run
/Dot (.) char def
/Meta (*+?) anyof def
/Character (*+?.|()) noneof def
/Atom //Dot
//Character plus def
/Factor //Atom //Meta maybe seq def
/Term //Factor //Factor many seq def
/Expression //Term (|) char //Term xthen many seq def
/regex { string-input //Expression exec ps } def
(abc|def|ghi) regex
quit
Это работает, но вывод имеет множество []
пустых массивов, которые действительно мешают обработчикам значений bind
.
$ gsnd -q -dNOSAFER pc9re2.ps
stack:
[[[[[97 []] [[98 []] [[99 []] []]]] [[[100 []] [[101 []] [[102 []]
[]]]] [[[103 []] [[104 []] [[105 []] []]]] []]]] null]]
Это происходит всякий раз, когдаseq
комбинатор секвенирования принимает результат от maybe
или many
(который использует maybe
), который имел ноль вхождений.
Как обычно исключают этот дополнительный шум в выходных данных с помощью Parser Combinators?
github repo