首页 > 解决方案 > Scala解析器与List左递归

问题描述

我的问题是我想实现一个(在纸上)看起来像这样的语法:

functionCall = expression "(" [{expression ";"} expression ] ")"

这里有些例子:

使用这个指定的语法,这也应该起作用:

foo(var1)()

  • foo(var1) => 表达式
  • "("
  • ")"
  • 使用这种语法会发生左递归,我不知道如何处理它。

    我正在使用 Scala 解析器库来实现这个语法。

    我查看了一些帖子,尤其是这个Recursive definitions with scala-parser-combinators以找出解决方案。

    我找到了许多类似问题的解决方案:

    expression ~ "." ~ expression

    我试图为我的问题复制解决方案,但我无法取得成功。

    我的简化代码如下所示:

    sealed trait Baz
    case class Start(code: Baz) extends Baz
    case class FunctionCall(call: Baz, arg: List[Baz]) extends Baz
    case class foo(text: String) extends Baz
    case class bar(nr: Int) extends Baz
    
    class ExpParser extends JavaTokenParsers {
    
      def start: Parser[Start] = expression ^^ {s => Start(s)}
    
      def expression: Parser[Baz] = foo | bar | functionCall 
    
      private val foo: Parser[Foo] = "[a-z]*".r ^^ {f => Foo(f)}
      private val bar: Parser[Bar] = "[0-9]*".r ^^ {b => Bar(b)}
    
      private val functionCall: Parser[Baz] = expression ~ "(" ~  repsep(expression, ";") <~ ")" ^^ {case l~_~r => FunctionCall(l,r)}
    }
    
    object ParseProgram extends ExpParser {
      def parse(s: String): ParseResult[Start] = {
        parseAll(code, s)
      }
    }
    
    

    我曾尝试使用chainl1但阅读实施,至少在我看来这对我的问题不起作用。

    我想知道是否有任何方法可以更改我的代码,以便我可以避免这种左递归并保持functionCallList 的数据结构。

    如果我有什么不清楚的地方,我很抱歉,很乐意回答你。

    非常感谢任何帮助!

    标签: scalaparsingrecursion

    解决方案


    推荐阅读