Scala 如何在解析器组合器中过滤保留字?

Scala 如何在解析器组合器中过滤保留字?,scala,parsing,parser-combinators,Scala,Parsing,Parser Combinators,我正在使用Scala的Parser Combinator框架,扩展RegexParsers类。我有一个标识符标记,它以字母开头,可以包含字母字符、破折号、下划线和数字,只要它不是保留字之一。我尝试使用解析器的not()函数来停止使用保留字,但是它也在匹配前缀为保留字的标识符 def reserved = "and" | "or" def identifier: Parser[String] = not(reserved) ~> """[a-zA-Z][\.a-zA-Z0-9_-]*"""

我正在使用Scala的Parser Combinator框架,扩展
RegexParsers
类。我有一个
标识符
标记,它以字母开头,可以包含字母字符、破折号、下划线和数字,只要它不是保留字之一。我尝试使用解析器的
not()
函数来停止使用保留字,但是它也在匹配前缀为保留字的标识符

def reserved = "and" | "or"

def identifier: Parser[String] = not(reserved) ~> """[a-zA-Z][\.a-zA-Z0-9_-]*""".r
然而,当我试图解析像
这样的标识符时,今天我得到一个错误,说
预期失败

如果保留字是令牌的完全匹配项而不仅仅是前缀,我如何仅过滤保留字


在这种情况下,当使用
not()
时,是否有改进错误报告的方法?在其他情况下,我得到了解析器所期望的正则表达式,但在这种情况下,它只是说
失败
,没有任何细节。

您可以使用
过滤器WithError
过滤掉保留字并自定义错误消息,如下所示:

    val reservedWords = HashSet("and", "or")

    val idRegex= """[a-zA-Z][\.a-zA-Z0-9_-]*""".r

    val identifier = Parser(input =>
      idRegex(input).filterWithError(
        !reservedWords.contains(_),
        reservedWord => s"YOUR ERROR MESSAGE FOR $reservedWord",
        input
      )
    )

是否绝对需要使用正则表达式?您可以使用组合模式匹配和比较参数,如
.equalsIgnoreCase
,以获得所需的结果。不确定组合模式匹配是什么意思。是的,标记必须与正则表达式匹配,除了一些保留字(我想保留在正则表达式之外)。它是一个相当重要的解析器,在其他地方使用正则表达式。马克西姆的解决方案非常有效。