如何在FParsec中处理左递归

时间:2011-12-31 21:05:32

标签: parsing f# fparsec left-recursion

我的语言使用带有一个附加功能的s表达式 - 一个点运算符,用于访问数组或结构中的元素。

目前,我的解析器使用access运算符

处理此代码
; Parition a sequence into a pair of sequences.
; NOTE: currently not tail-recursive.
[defRec partition [pred seq]
  (if (isDone seq)
      (pair (list) (list))
      (let (value (peek seq))
           (nextSeq (next seq))
           (nextResult (partition pred nextSeq))
           (nextResultFirst (access :m:first nextResult))
           (nextResultSecond (access :m:second nextResult))
           (if (pred value)
               (pair (cons value nextResultFirst) nextResultSecond)
               (pair nextResultFirst (cons value nextResultSecond)))))]

但是,我想使用点运算符添加备用解析 -

; Parition a sequence into a pair of sequences.
; NOTE: currently not tail-recursive.
[defRec partition [pred seq]
  (if (isDone seq)
      (pair (list) (list))
      (let (value (peek seq))
           (nextSeq (next seq))
           (nextResult (partition pred nextSeq))
           (nextResultFirst nextResult.first)
           (nextResultSecond nextResult.second)
           (if (pred value)
               (pair (cons value nextResultFirst) nextResultSecond)
               (pair nextResultFirst (cons value nextResultSecond)))))]

他们将解析为等效的AST。左递归在这里很重要,因为像(f x).y这样的表达式应该像(access :m:y (f x))

一样解析出来

但是,我不知道如何让FParsec处理这种类型的左递归解析,或者我还有什么替代左递归。

0 个答案:

没有答案