Scala RegexParser用于方法调用解析

时间:2018-10-26 01:20:39

标签: regex scala parsing

我正在尝试编写一个解析器,用于解析以字符串格式给出的方法。例如,我有两个名为(naiveMethod.contains(naiveObj))(naiveMethod.get())

的方法调用

我编写了以下代码来尝试对此进行解析:

def string: Parser[Any] = """[a-zA-Z\_]+""".r ^^ {_.toString}

def obj: Parser[Any] = """[a-zA-Z\_]+""".r ^^ {_.toString} | "(" ~> functionCall <~ ")"

def methodCall: Parser[String] = string ~ "(" ~ ((string ~ ")") | ")") ^^ {
 case str1 ~ "(" ~ str2 ~ ")" =>
   val stringBuilder = str1 + "(" + str2 + ")"
   stringBuilder
 case str1 ~ "(" ~ ")" =>
  val stringBuilder = obj1 + "()"
  stringBuilder
}

def functionCall: Parser[Any] =
  obj ~ rep("." ~ methodCall)  ^^{
  case obj ~ list => list.foldLeft(obj) {
   case (obj1, "." ~ methodCall) =>
   println(obj1 +  methodCall.toString)
 }
}

我遇到的问题是,尽管string函数中的methodCall调用为我提供了适当的string名称,但它们不匹配methodCall中提到的情况。我不确定我到底要去哪里,因此可以提供任何帮助。预先感谢!

1 个答案:

答案 0 :(得分:0)

表达式string ~ "(" ~ ((string ~ ")") | ")")的类型为Parser[Any ~ String ~ Serializable]

默认情况下,匹配项case str1 ~ "(" ~ str2 ~ ")"的解析方式类似于case ((str1 ~ "(") ~ str2) ~ ")"。因此,Scala尝试将Serializable")"Stringstr2Anystr1 ~ "("进行匹配。这是错误的,匹配失败。

要使Scala以所需的顺序匹配,可以将str2 ~ ")"的部分包装起来,该部分应该与Serializable匹配,并放在方括号中。以下代码有效:

def methodCall: Parser[String] = string ~ "(" ~ ((string ~ ")") | ")") ^^ {
  case str1 ~ "(" ~ (str2 ~ ")") =>
    val stringBuilder = str1 + "(" + str2 + ")"
    stringBuilder
  case str1 ~ "(" ~ ")" =>
    val stringBuilder = str1 + "()"
    stringBuilder
}