ANTLR4 解析不适​​用于重复的文本

ANTLR4 parsing does not work for repeated text

我已经成功解析了下面的文件信息,直到第 "To be finalized..." 行具有给定的语法。但是一旦我们在 "To be finalized..." 之后接收到更多数据,解析器就会跳过 1-3 条记录,并在输出中首先给出 header 和最后 2 条记录(4-5)。

问题:如何更改语法,才能解析所有数据? 非常感谢您 in-light 解决以下问题:

正在解析文本:(此处的每个记录都将是 Java 中的地图)

+++    AV_AW_GER_1111_SpringShop        2017-10-09 12:00:00
O&M    #58513
%%/*123456*/FUN TEST:REC=ALL,SD=2017&10&02,ST=03&01&01,CLRSD=2017&10&09,CLRST=08&10&00;%%
RETCODE = 0  Operation succeeded

1RECORD  11111       Creat     Warning         KRAN      14758    Signaling
     Sync serial No.  =  121212
          Record name  =  Cell PCI Conflict
   Record raised time  =  2017-11-14 12:15:41
       Place info  =  Local Cell ID=1, Cell Name=AO_5655_56551_L1_B, eNodeB ID=15655, Cell ID=1, NB-IoT Cell Flag=FALSE

2RECORD  22222       Creat     Major           KRAN      52896    Environment
     Sync serial No.  =  231123
          Record name  =  Intruder Record
   Record raised time  =  2017-11-14 13:00:09
       Place info  =  Cabinet No.=0, Subrack No.=0, Slot No.=19, Port No.=2, Board Type=UPEU

3RECORD  33333       Creat     Major           KRAN      36369    Environment
     Sync serial No.  =  340434
          Record name  =  Intruder Record
   Record raised time  =  2017-11-14 12:58:40
       Place info  =  Cabinet No.=0, Subrack No.=0, Slot No.=19, Port No.=2, Board Type=UPEU
(Number of results = 3)

To be finalized...

---    END

+++    QW_ER_TY_2222_SpringPool       2017-11-20 13:29:34
O&M    #89874
%%/*012567*/FUN TEST:REC=ALL,SD=2017&10&02,ST=03&01&01,CLRSD=2017&10&09,CLRST=08&10&00;%%
RETCODE = 0  Operation succeeded

4RECORD  55555       Creat     Warning         KRAN      14736    Signaling
     Sync serial No.  =  45585
          Record name  =  Cell PCI Conflict
   Record raised time  =  2017-11-14 12:15:41
       Place info  =  Local Cell ID=1, PCI Value=408, Conflict Type=Confusion, NB-IoT Cell Flag=FALSE 
       Result type  =  Normally cleared

5RECORD  44444       Creat     Major           KRAN      65137    Environment
     Sync serial No.  =  99999
          Record name  =  Intruder Record
   Record raised time  =  2017-11-14 12:58:40
       Place info  =  Cabinet No.=0, Subrack No.=0, Slot No.=19, Port No.=2, Board Type=UPEU
        Result type  =  Normally cleared
(Number of results = 2)

2 reports in total

---    END

语法:

rspAlarm:
      alarmResponse alarmResponse1 EOF;
alarmResponse:
   header recordAlarm+ (COMPLEX_FLAG EOL)? TERMINATOR EOL;
alarmResponse1:
      header recordAlarm+ TERMINATOR EOL;
recordAlarm:
     completionStatus|(title SPACE* EOL)|(SPACE* keyValue '=' SPACE* value EOL)|TOTAL|EOL ;
header:
   connectInfo server_code FUNCTION EOL responseIdentification;
connectInfo:
     '+++' SPACE+ STRING (SPACE STRING|NUMBER)? SPACE+ timeStamp EOL*;
timeStamp:
    DATE EOL;
server_code:
    'O&M' SPACE+ HUSH NUMBER+ EOL;
responseIdentification:
        'RETCODE' SPACE '=' SPACE codeStatus SPACE+ completionStatus;
codeStatus:
    NUMBER;
completionStatus:
    COMPLETION_CODE EOL;
title:
    (STRING|NUMBER) (SPACE+ (STRING|NUMBER))*;
keyValue:
    ((STRING|NUMBER) SPACE*)+;
value:
     ( (STRING|NUMBER|DATE|HUSH) SPACE*)+;

NUMBER:('-')?[0-9]+;
DATE:NUMBER+'-'NUMBER+'-'NUMBER+SPACE+NUMBER+':'NUMBER+':'NUMBER+;
STRING:[a-zA-Z0-9\-\'\&\_\@\=\.\:\,\(\)\/]+;
FUNCTION:[\%][\%](.*)[\%][\%];
COMPLETION_CODE:('Success'|'Operation succeeded.'|'No record exists'|'Invalid command,it is inexecutable.'|) EOL;
TOTAL:'(Number of results = ' NUMBER ')';
COMPLEX_FLAG:('To be finalized...');
TERMINATOR :('---    END');
DASH:[\-]+;
PLUS:[\+][\+][\+];
EOL:'\r'?'\n';
SPACE:' ';
HUSH:[\#];
WS:('\t'|'\n'|'\r')->skip;

输出:

+++    AV_AW_GER_1111_SpringShop        2017-10-09 12:00:00
O&M    #58513
%%/*123456*/FUN TEST:REC=ALL,SD=2017&10&02,ST=03&01&01,CLRSD=2017&10&09,CLRST=08&10&00;%%
RETCODE = 0  Operation succeeded

And Record 4 and 5 + details after. 

解析器正在跳过记录 1-3,但已读取所有文件。

我认为令牌 "FUNCTION" 消耗了所有记录,在您的情况下您应该使用非贪婪规则,尝试以下操作:

FUNCTION:[\%][\%](.*?)[\%][\%];

注意问号