排除 Unicode 类别中的某些字符

Exclude some characters in Unicode category

我正在尝试按照 "all characters in the Letter and Symbol Unicode categories except a few reserved characters." 从 lexer rules 实施规则,我知道我可以使用 \p{___} 来匹配 Unicode 类别,但我不确定如何处理排除某些字符。

查看示例语法,我被引导到几个不同的方向。例如,Java 9 grammar seems to use predicates in order to directly use Java's built in isJavaIdentifier() while others 手动定义每个有效字符。

如何实现此功能?

如果没有目标特定代码,您将必须自己定义范围,以便您要排除的字符不属于这些范围。您不能使用 \p{...} 然后从中排除某些字符。

使用特定于目标的代码,您可以按照 Java 9 语法进行操作:

@lexer::members {
  boolean aCustomMethod(int character) {
    // Your logic to see if 'character' is valid. You're sure
    // that it's at least a char from \p{Letter} or \p{Symbol}
    return true;
  }
}

TOKEN
 : [\p{Letter}\p{Symbol}] {aCustomMethod(_input.LA(-1))}?
 ;