我有一个使用模式进行字符串插值的语法:类似于以下内容:
lexer grammar Example;
//default mode tokens
LBRACE: '{' -> pushMode(DEFAULT_MODE);
RBRACE: '}' -> popMode;
OPEN_STRING: '"' -> pushMode(STRING);
mode STRING;
ID_INTERPOLATION: '$' IDEN;
OPEN_EXPR_INTERPOLATION: '${' -> pushMode(DEFAULT_MODE);
TEXT: '$' | (~[$\r\n])+;
CLOSE_STRING: '"' -> popMode;
parser grammar ExampleParser;
options {tokenVocab = Example;}
test: string* EOF;
string: OPEN_STRING string_part* CLOSE_STRING;
string_part: TEXT | ID_INTERPOLATION | OPEN_EXPR_INTERPOLATION expr RBRACE;
//more rules that use LBRACE and RBRACE
现在这有效并且将所有内容标记为大多我想要的,但是它确实有2个缺陷。
我的IDE仅基于标记突出显示,因此这是一个问题,我希望能够以不同的方式突出显示它们。因此,基本上,我想要一个解决方案,使RBRACE在字符串中时成为不同的令牌。
我更喜欢在没有语义谓词的情况下进行操作,因为我不想将其与某种语言联系在一起,但是如果需要,我可以接受,我可能需要更多说明,因为我没有用了那么多。
我有一个使用模式进行字符串插值的语法:类似于lexer grammar; //默认模式令牌LBRACE:'{'-> pushMode(DEFAULT_MODE); RBRACE:'}'-> ...
类似这样的东西(除了默认模式,还有代码和字符串模式):