Antlr4中的字符串插值

问题描述 投票:0回答:1

我有一个使用模式进行字符串插值的语法:类似于以下内容:

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个缺陷。

  1. 如果RBRACES的数量过多,它将弹出第一个默认模式,该模式可能会使IDE出错,而不仅仅是显示错误。
  2. 用于关闭块和关闭插值的令牌是相同的,因此我无法根据需要突出显示它们。 (这是主要的)
  3. 我的IDE仅基于标记突出显示,因此这是一个问题,我希望能够以不同的方式突出显示它们。因此,基本上,我想要一个解决方案,使RBRACE在字符串中时成为不同的令牌。

我更喜欢在没有语义谓词的情况下进行操作,因为我不想将其与某种语言联系在一起,但是如果需要,我可以接受,我可能需要更多说明,因为我没有用了那么多。

我有一个使用模式进行字符串插值的语法:类似于lexer grammar; //默认模式令牌LBRACE:'{'-> pushMode(DEFAULT_MODE); RBRACE:'}'-> ...

antlr antlr4
1个回答
0
投票

类似这样的东西(除了默认模式,还有代码和字符串模式):

© www.soinside.com 2019 - 2024. All rights reserved.