Antlr4 用终止条件定义Antlr lexer规则

Antlr4 用终止条件定义Antlr lexer规则,antlr4,Antlr4,有一种情况需要解析由“2/”分隔的2个令牌。这两个标记都可以是字母数字字符,没有固定长度 示例:Abcd34D22/ERTD34D或ABCD2/DEF 所需输出:令牌1='Abcd34D2',分隔符:'2/',令牌2='ERTD34D' 我想知道是否有一种方法可以为TOKEN1定义lexer规则并管理歧义性,这样如果2后面跟着/,它就可以作为分隔符匹配。下面是用于说明的示例令牌定义 fragment ALPHANUM: [0-9A-Za-z]; fragment SLASH: '/'; TOKE

有一种情况需要解析由“2/”分隔的2个令牌。这两个标记都可以是字母数字字符,没有固定长度

示例:Abcd34D22/ERTD34D或ABCD2/DEF

所需输出:令牌1='Abcd34D2',分隔符:'2/',令牌2='ERTD34D'

我想知道是否有一种方法可以为TOKEN1定义lexer规则并管理歧义性,这样如果2后面跟着/,它就可以作为分隔符匹配。下面是用于说明的示例令牌定义

fragment ALPHANUM: [0-9A-Za-z];
fragment SLASH: '/';
TOKEN1 : (ALPHANUM)+;
SEPARATOR : '2' SLASH -> mode(TOKEN2_MODE);
mode TOKEN2_MODE;
TOKEN2 : (ALPHANUM)+;

好了,您必须使用,这意味着您必须在语法中添加一些特定于目标的代码。如果您的目标语言是Java,则可以执行以下操作:

TOKEN1
 : TOKEN1_ATOM+
 ;

fragment TOKEN1_ATOM
 : [013-9A-Za-z]              // match a single alpha-num except '2'
 | '2' {_input.LA(1) != '/'}? // only match `2` if there's no '/' after it
 ;