4

我的语言使用带有一个附加功能的 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 处理这种类型的左递归解析,或者我有什么替代左递归的方法。

4

0 回答 0