代码之家  ›  专栏  ›  技术社区  ›  fryguybob

使用haskell parsec自定义空白

  •  6
  • fryguybob  · 技术社区  · 15 年前

    我想用Parsec的 makeTokenParser 构建我的解析器,但我想使用自己的定义 whiteSpace . 执行以下操作将替换 空格符 按照我的定义,但是 lexeme 解析器仍然使用旧的定义(例如 P.identifier lexer 将使用旧的空白)。

    ...
    lexer :: P.TokenParser ()
    lexer      = l { P.whiteSpace = myWhiteSpace }
       where l = P.makeTokenParser myLanguageDef
    ...
    

    查看的代码 makeTokenParser 我想我明白为什么会这样。我想知道是否有任何解决方法来避免完全复制 标记分析器 ?

    1 回复  |  直到 11 年前
        1
  •  7
  •   MtnViewMark    11 年前

    可悲的是,我觉得没有办法。中使用的本地定义 makeTokenParser 递归地引用它们自己,所以,正如您所注意到的, lexeme 使用 whiteSpace 按照这里的定义,而不是 空格符 在您的 lexer 对象。

    代码是嘲弄的,因为它使用了与中的两个本地函数相同的名称 标记分析器 作为 TokenParser 构造器。它们实际上是完全不同的实体。