我正在尝试弄清楚如何编写一个Haskell Parsec解析器来使用任何这些Ruby表达式:
hello("test", 'test2')
my_variable
hello(world("test"))
(hello + " " + world)
当解析器在任何这些项的开头开始解析时,它应该返回整个字符串并在项的末尾停止解析。如果这些项目中的任何一项后跟逗号,则不应使用该逗号。
我曾尝试过几次为这些类型的表达式编写解析器,但没有成功。没有必要解析这些表达式的子组件 - 我不需要完整的AST。我只需要消耗和捕获这些类型的块。
我认为,除了任何前面的标识符之外,可能有足够的启发式方法可能只需要平衡任何括号并吃掉外部平衡括号内的所有内容。但是我需要一些帮助来编写一个以这种方式工作的解析器。
答案 0 :(得分:1)
尝试在不解析所有内容的情况下进行解析是没有意义的。要么(a)写一个结构化的,正确的解析器,或(b)写一些吃掉输入的东西,做一些计数和跟踪,但实际上并没有解析它。你会发现(b)用parsec很难做到。关键问题是正确性:除非你解析字符串,否则你将如何解析this(example + "(with" + (weird ("bracketing)?")+"("))
?你应该咬紧牙关并首先编写一个string
解析器,然后编写一个identifier
解析器,然后编写相互递归的expression
,argumentList
和function
解析器。您不必返回AST。