0

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

问题是,如果我创建解析航空公司、号码和 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?

4

2 回答 2

1

这个怎么样:

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 ;

之后应该很容易分开AirlineAndFlNm。并且由于AirlineAndFlNm放在 before PNR,如果可以的话,它会匹配。

于 2014-07-18T10:19:42.390 回答
0

让词法分析器标记单个字符并将这些规则提升为解析器规则:

// 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]
 ;
于 2014-07-17T09:37:16.020 回答