使用解析器组合器抑制'seq(p,many(p))'构造中'many'的空结果

时间:2019-03-25 21:23:18

标签: functional-programming postscript parser-combinators

我正试图按照Hutton和Meijer的“ Monadic Parser Combinators”构建解析器组合器。我的实现是在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排序组合器接受出现次数为零的maybemany(使用maybe)的结果,就会发生这种情况。

使用Parser组合器排除输出中的额外噪声的正常方法是什么?

github repo

1 个答案:

答案 0 :(得分:0)

S。看来我可以解决它。我在seq中添加了特殊代码以检测右侧的空白并将其丢弃。关于其他问题...