【发布时间】: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解析器,然后是相互递归的expression、argumentList和function解析器。您不必返回 AST。 -
这是有道理的。感谢您的建议。
-
@AndrewC 因为您的评论似乎回答了这个问题,您介意将其作为答案发布以将其从“未回答的问题”中移除吗?
-
@sclv 完成。我不确定这是否是一个了不起的答案,但我完全理解这份名单的观点。