我试图按照"字母和符号Unicode类别中的所有字符实现规则,除了一些保留字符。"从lexer rules开始,我知道我可以使用\p{___}
来匹配Unicode类别,但我不确定如何处理排除某些字符。
看一下示例语法,我带领了几个不同的方向。例如,Java 9 grammar似乎使用谓词来直接使用内置isJavaIdentifier()
的Java,而others手动定义每个有效字符。
如何实现此功能?
答案 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))}?
;