누군가가 다음 동작을 이해하도록 도와 줄 수 있습니다. parseAll (parseIf, "If bla blablaa")
은 is expected
이됩니다. 대신 나는 항상 string matching regex 'is\b' expected but 'b' found
을 얻습니다. " If bla is blablaa"
(맨 처음 공백에 주목하십시오)이 동일한 동작을하기 때문에 공백과 관련이 있다고 생각합니다. 나는 StandardTokenParsers로 시험해 보았고 모든 것이 잘 동작했다. 하지만 STP는 불행히도 정규 표현식을 지원하지 않습니다. 추가 질문 : 문자 시퀀스 대신 문자열 시퀀스를 사용하도록 RegexParser를 어떻게 변경해야합니까? 그러면 오류보고를 훨씬 쉽게 할 수 있습니다.RegexParser에 대한 사용자 지정 오류
lazy val parseIf = roleGiverIf ~ giverRole
lazy val roleGiverIf =
kwIf ~> identifier | failure("""A rule must begin with if""")
lazy val giverRole =
kwIs ~> identifier | failure("""is expected""")
lazy val keyword =
kwIf | kwAnd | kwThen | kwOf | kwIs | kwFrom | kwTo
lazy val identifier =
not(keyword) ~ roleEntityLiteral
// ...
def roleEntityLiteral: Parser[String] =
"""([^"\p{Cntrl}\\]|\\[\\/bfnrt]|\\u[a-fA-F0-9]{4})\S*""".r
def kwIf: Parser[String] = "If\\b".r
def kwIs: Parser[String] = "is\\b".r
// ...
parseAll(parseIf, "If bla blablaa") match {
case Success(parseIf, _) => println(parseIf)
case Failure(msg, _) => println("Failure: " + msg)
case Error(msg, _) => println("Error: " + msg)
나는 정규식과 어휘 능력을 가진 파서를 작성했고, 당신이 제안한대로 acceptIf를 사용했다. 그러나 위의 예가 예상대로 작동하지 않는 것은 여전히 이상합니다. 도움을 주셔서 감사합니다 – awertos
@awertos 마침내 문제가 무엇인지 알아 냈습니다. 첫 번째 해결책은 내가 생각했던 것보다 더 적절했다. 나는 단지 공백이 아닌 문자를 사용하지 않고 오류를 적절한 위치에 표시하도록 변경했다. –