1

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

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

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

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

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

4

1 回答 1

1

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

于 2016-03-05T01:48:40.747 回答