如何使用ANTLR4消除文本歧义,ANTLR4有时是两个标记,有时是第三个标记?

如何使用ANTLR4消除文本歧义,ANTLR4有时是两个标记,有时是第三个标记?,antlr4,lexer,disambiguation,Antlr4,Lexer,Disambiguation,我对ANTLR4语法有问题。我需要解析一个包含6个字符的文本。 根据文本的上下文,它可以表示: -一个6-a标识符(航班预订号-PNR-看起来像7B22MS或JPN92Y或类似物), -航空公司代号(两个字母)+航班号(四个数字),例如LH1856 问题是,如果我创建lexer规则来解析航空公司、号码和PNR标识符,如下所示: 航空公司:A''Z''A''Z' FlNum:('0'..'9')('0'..'9')('0'..'9')('0'..'9') PNR:(‘A’、‘Z’、‘0’、‘9’)

我对ANTLR4语法有问题。我需要解析一个包含6个字符的文本。 根据文本的上下文,它可以表示: -一个6-a标识符(航班预订号-PNR-看起来像7B22MS或JPN92Y或类似物), -航空公司代号(两个字母)+航班号(四个数字),例如LH1856

问题是,如果我创建lexer规则来解析航空公司、号码和PNR标识符,如下所示:

航空公司:A''Z''A''Z'

FlNum:('0'..'9')('0'..'9')('0'..'9')('0'..'9')

PNR:(‘A’、‘Z’、‘0’、‘9’)(‘A’、‘Z’、‘0’、‘9’)(‘A’、‘Z’、‘0’、‘9’)(‘A’、‘Z’、‘0’、‘9’)(‘A’、‘Z’、‘0’、‘9’)(‘A’、‘Z’、‘0’、‘9’)

然后,PNR规则总是获胜并吃掉所有与其模式匹配的令牌


如果语法上下文需要,我如何更改此项以便解析Airline和FlNum?

让lexer标记单个字符,并将这些规则升级为解析器规则:

// parser rules

airline
 : LETTER
 ;

fl_num
 : DIGIT DIGIT DIGIT DIGIT
 ;

pnr
 : alpha_num alpha_num alpha_num alpha_num alpha_num alpha_num
 ;

alpha_num
 : DIGIT
 | LETTER
 ;

// lexer rules

DIGIT
 : [0-9]
 ;

LETTER
 : [A-Z]
 ;
这个怎么样:

AirlineAndFlNm : 'A'..'Z' 'A'..'Z' ('0'..'9')('0'..'9')('0'..'9')('0'..'9');

PNR : ('A'..'Z'|'0'..'9')('A'..'Z'|'0'..'9')('A'..'Z'|'0'..'9')('A'..'Z'|'0'..'9')('A'..'Z'|'0'..'9')('A'..'Z'|'0'..'9');
或更具可读性:

AirlineAndFlNm : LETTER LETTER DIGIT DIGIT DIGIT DIGIT ;

PNR : AlphaNum AlphaNum AlphaNum AlphaNum AlphaNum AlphaNum;

// fragments can only be used by other rules, will never create a token on their own
fragment LETTER: 'A'..'Z';
fragment DIGIT : '0'..'9';
fragment AlphaNum: LETTER | DIGIT ;
之后应易于分离
航空线和FLNM
。 由于
airlines和FLNM
放在
PNR
之前,如果可以,它将匹配