Parsing scala解析器组合器中的回溯?

Parsing scala解析器组合器中的回溯?,parsing,scala,optional,backtracking,combinators,Parsing,Scala,Optional,Backtracking,Combinators,scala的解析器组合器似乎没有回溯。我的语法(见下图)无法正确解析以下“stmt”: copy in to out . 这应该很容易通过回溯进行解析: stmt: (to out(copy in)) 还是我遗漏了什么 解析器: type ExprP = Parser[Expr] type ValueP = Parser[ValExpr] type CallP = Parser[Call] type ArgsP = Parser[Seq[Expr]] val ident = "[a

scala的解析器组合器似乎没有回溯。我的语法(见下图)无法正确解析以下“stmt”:

copy in to out .
这应该很容易通过回溯进行解析:

stmt: (to out(copy in))
还是我遗漏了什么

解析器:

type ExprP = Parser[Expr]
type ValueP = Parser[ValExpr]
type CallP = Parser[Call]
type ArgsP = Parser[Seq[Expr]]

val ident     = "[a-zA-Z\\+\\-\\*/%><\\\\\\=]+".r
val sqstart   = "\\["                          .r
val sqend     = "\\]"                          .r
val del       = ","                            .r
val end       = "\\."                          .r

def stmt: ExprP      = expr <~ end
def expr: ExprP      = ucall | call | value
def value: ValueP    = ident ^^ {str => IdentExpr(str)}
def call: CallP      = (args ~ ident ~ expr) ^^ {case args ~ method ~ upon => Call(args, method, upon)}
def ucall: CallP     = (ident ~ expr) ^^ {case method ~ upon => Call(Seq(), method, upon)}
def args: ArgsP      = advargs | smplargs
def smplargs: ArgsP  = expr ^^ {e => Seq(e)}
def advargs: ArgsP   = (sqstart ~> repsep(expr, del) <~ sqend) ^^ {seq => seq}
type ExprP=Parser[Expr]
类型ValueP=Parser[ValExpr]
类型CallP=Parser[Call]
类型ArgsP=Parser[Seq[Expr]]

val ident=“[a-zA-Z\\+\-\\*/%>你想在2.8中使用
PackratParsers
。我认为packrat解析器是唯一的回溯解析器


编辑:从2015年年中开始,您应该改为使用。它不仅速度更快,而且更易于使用(特别是在从解析构建数据结构时)。

您的问题不是回溯。
scala.util.parsing.combinator
中的标准
运算符将进行回溯。您的问题是左递归(
expr
→ <代码>呼叫
→ <代码>参数→ <代码>smplargs→
expr
)。Packrat解析可能确实有帮助。

让它接近工作状态,现在我得到一个堆栈溢出。更新的解析器。它似乎无法修复它;我仍然可以修复它(因为有一个左递归语法),我听说Packrat解析应该能够修复它。如果我让它在调用之前解析值,那么它就不会解析(没有回溯?)。也许我还没有激活packrat解析,但我确保混入PackratParser并从所有函数返回PakratParser。你知道一些关于PackratParser的信息吗?哦,好吧,现在我找到了。对于所有需要packrat解析程序的人来说:记住用“lazy val”替换“def”,用“lazy val”替换“Parser[t]”[T] “并使parsers类/对象从PackratParsers混入。@Anonymous请更清楚地说明您的上一条指令:“使parsers类/对象从PackratParsers混入”。对于类来说,这仅仅是“使用PackratParsers”吗?@rex fastparse不会处理左递归