我尝试使用 Parser Combinators 在 scala 中编写解析器。如果我递归匹配,
def body: Parser[Body] =
("begin" ~> statementList ) ^^ {
case s => { new Body(s); }
}
def statementList : Parser[List[Statement]] =
("end" ^^ { _ => List() } )|
(statement ~ statementList ^^ { case statement ~ statementList => statement :: statementList })
然后,只要语句中有错误,我就会收到很好的错误消息。然而,这是丑陋的长代码。所以我想写这个:
def body: Parser[Body] =
("begin" ~> statementList <~ "end" ) ^^ {
case s => { new Body(s); }
}
def statementList : Parser[List[Statement]] =
rep(statement)
此代码有效,但仅在 FIRST 语句中有错误时才打印有意义的消息。如果它在后面的语句中,则消息将变得非常不可用,因为解析器希望看到整个错误语句被“end”标记替换:
Exception in thread "main" java.lang.RuntimeException: [4.2] error: "end" expected but "let" found
let b : string = x(3,b,"WHAT???",!ERRORHERE!,7 )
^
我的问题:有没有办法让rep和repsep与有意义的错误消息结合使用,将插入符号放在正确的位置而不是重复片段的开头?