Antlr 词法分析器仅在下一个字符不是括号时才匹配

Antlr lexer match only when next character isn't a bracket

我正在尝试编写一个词法分析器规则来匹配如下变量名。

TYPE: [a-zA-Z][a-zA-Z0-9_];

但是,我也有一个类似于下面的解析器规则。

dup: TYPE 'x{' TYPE '}' 

这些很容易匹配,

HELLO x{wee}
catx x{text}

但我也希望能够匹配以下内容。

HELLOx{wee}
namex{text}

其中 x{ 将匹配解析器规则中的标记。问题是 x 被放入 TYPE 令牌中,因此解析器不知道如何处理随机 {.

有没有办法让词法分析器不匹配尾随的 x,如果它后面跟着 {?

这可以通过向前看来解决,例如

dup
  : TYPE 'x{' TYPE '}'
  ; 

TYPE
  : [a-zA-Z]([a-wy-zA-Z0-9_]|('x' {_input.LA(1) != '{'}?))*
  ;

TYPE 的定义仅当前瞻不是 { 时才允许 x