Подавить пустой результат из конструкции many в seq (p, many (p)) с помощью комбинаторов синтаксического анализа - PullRequest
1 голос
/ 26 марта 2019

Я пытаюсь создать комбинаторы парсеров, следуя Хаттону и Мейеру, «Монадные парсер-комбинаторы».Моя реализация написана на 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

1 Ответ

0 голосов
/ 26 марта 2019

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

...