【问题标题】:Haskell Parsec parser for an expression starting with a word or parenthesis, ending with end of word or a parenthesisHaskell Parsec 解析器,用于以单词或括号开头,以单词结尾或括号结尾的表达式
【发布时间】:2013-04-05 00:42:02
【问题描述】:

我正在尝试弄清楚如何编写一个 Haskell Parsec 解析器来使用这些 Ruby 表达式:

   hello("test", 'test2') 
   my_variable
   hello(world("test"))
   (hello + " " + world)

当解析器从这些项目的开头开始解析时,它应该返回整个字符串并在项目的末尾停止解析。如果其中任何一项后跟逗号,则不应使用该逗号。

我尝试了几次为这些类型的表达式编写解析器,但没有成功。没有必要解析这些表达式的子组件——我不需要完整的 AST。我只需要消耗和捕获这些块。

我认为,除了任何前面的标识符之外,也许一个适当的启发式可能只涉及平衡任何括号并吃掉外部平衡括号内的所有内容。但我需要一些帮助来编写一个以这种方式工作的解析器。

【问题讨论】:

  • 在不解析everything的情况下尝试解析是没有意义的。要么(a)编写一个结构化的、正确的解析器,要么(b)编写一些吃输入的东西,做一些计数和跟踪,但实际上并不解析它。你会发现使用 parsec 很难做到 (b)。关键问题是正确性:除非您解析字符串,否则您将如何解析this(example + "(with" + (weird ("bracketing)?")+"("))?你应该咬紧牙关先写一个string 解析器,然后是identifier 解析器,然后是相互递归的expressionargumentListfunction 解析器。您不必返回 AST。
  • 这是有道理的。感谢您的建议。
  • @AndrewC 因为您的评论似乎回答了这个问题,您介意将其作为答案发布以将其从“未回答的问题”中移除吗?
  • @sclv 完成。我不确定这是否是一个了不起的答案,但我完全理解这份名单的观点。

标签: haskell parsec


【解决方案1】:

不解析一切就尝试解析是没有意义的。要么(a)编写一个结构化的、正确的解析器,要么(b)编写一些吃输入的东西,做一些计数和跟踪,但实际上并不解析它。你会发现使用 parsec 很难做到 (b)。关键问题是正确性:除非您解析字符串,否则您将如何解析this(example + "(with" + (weird ("bracketing)?")+"("))?你应该咬紧牙关先写一个string 解析器,然后是identifier 解析器,然后是相互递归的expressionargumentListfunction 解析器。您不必返回 AST。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-21
    • 2019-11-19
    • 2017-08-12
    • 1970-01-01
    • 1970-01-01
    • 2015-12-16
    • 2017-01-29
    • 1970-01-01
    相关资源
    最近更新 更多