我正在尝试编写一个解析器,用于解析以字符串格式给出的方法。例如,我有两个名为(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
中提到的情况。我不确定我到底要去哪里,因此可以提供任何帮助。预先感谢!
答案 0 :(得分:0)
表达式string ~ "(" ~ ((string ~ ")") | ")")
的类型为Parser[Any ~ String ~ Serializable]
。
默认情况下,匹配项case str1 ~ "(" ~ str2 ~ ")"
的解析方式类似于case ((str1 ~ "(") ~ str2) ~ ")"
。因此,Scala尝试将Serializable
与")"
,String
与str2
和Any
与str1 ~ "("
进行匹配。这是错误的,匹配失败。
要使Scala以所需的顺序匹配,可以将str2 ~ ")"
的部分包装起来,该部分应该与Serializable
匹配,并放在方括号中。以下代码有效:
def methodCall: Parser[String] = string ~ "(" ~ ((string ~ ")") | ")") ^^ {
case str1 ~ "(" ~ (str2 ~ ")") =>
val stringBuilder = str1 + "(" + str2 + ")"
stringBuilder
case str1 ~ "(" ~ ")" =>
val stringBuilder = str1 + "()"
stringBuilder
}