Compiler construction 如何在antlr4 lexer g4文件中为IF()然后abc ELSEIF()然后xyz ElSE yzx ENDIF创建令牌

Compiler construction 如何在antlr4 lexer g4文件中为IF()然后abc ELSEIF()然后xyz ElSE yzx ENDIF创建令牌,compiler-construction,antlr4,lexer,Compiler Construction,Antlr4,Lexer,问题是我已经编写了lexer文件并创建了类似于 IF_EXPR : 'IF'; ELSEIF_EXPR : 'ELSEIF'; THEN_EXPR : 'THEN'; ELSE_EXPR : 'ELSE' 但在某些情况下,我可以在条件块或THEN块的一侧使用包含“IF”的字符串。它将字符串中的“IF”视为标记 例如: IF abc=1 THEN xyzIF=3 ELSE abc=2 ENDIF 在上面的例子中,我的Listar把XIZIF中的“IF”当作IFAXEPR令牌,

问题是我已经编写了lexer文件并创建了类似于

IF_EXPR : 'IF';
ELSEIF_EXPR : 'ELSEIF';
THEN_EXPR : 'THEN';
ELSE_EXPR : 'ELSE'
但在某些情况下,我可以在条件块或THEN块的一侧使用包含“IF”的字符串。它将字符串中的“IF”视为标记

例如:

IF abc=1 
THEN 
   xyzIF=3
ELSE 
   abc=2
ENDIF

在上面的例子中,我的Listar把XIZIF中的“IF”当作IFAXEPR令牌,但是它应该把XYZIF看作一个不同的标记。

你应该有一个与XYZIF:

匹配的标识符规则。
ITENTIFIER:[.]*有效吗?因为字符串也可以有任何特殊的字符?不,这太贪婪了。
// Keywords first!
IF : 'IF';

// After keywords, define something that matches an identifier:
IDENTIFIER : [a-zA-Z_] [a-zA-Z_0-9]*;