排除Unicode类别中的某些字符

时间:2018-03-06 03:39:11

标签: antlr4

我试图按照"字母和符号Unicode类别中的所有字符实现规则,除了一些保留字符。"从lexer rules开始,我知道我可以使用\p{___}来匹配Unicode类别,但我不确定如何处理排除某些字符。

看一下示例语法,我带领了几个不同的方向。例如,Java 9 grammar似乎使用谓词来直接使用内置isJavaIdentifier()的Java,而others手动定义每个有效字符。

如何实现此功能?

1 个答案:

答案 0 :(得分:0)

如果没有特定于目标的代码,您必须自己定义范围,以便您要排除的字符不属于这些范围。您无法使用\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))}?
 ;