首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ANTLR4解析不适用于重复文本。

ANTLR4解析不适用于重复文本。
EN

Stack Overflow用户
提问于 2017-11-27 10:40:32
回答 1查看 141关注 0票数 0

我已经成功地分析了下面的文件信息,直到行“待定.”用给定的语法。但一旦我们在“最后确定”之后收到更多数据.解析器跳过1-3条记录,在输出中给出第一个头和最后两个记录(4-5)。

问题:如何修改语法,以便能够对所有的数据进行解析?非常感谢您对以下问题的了解:

解析文本:(这里的每个记录都将是Java)

代码语言:javascript
运行
复制
+++    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

语法:

代码语言:javascript
运行
复制
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;

输出:

代码语言:javascript
运行
复制
+++    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. 

解析器是skippinig记录1-3,但所有文件都已被读取。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-29 09:31:55

我认为令牌“函数”消耗了所有记录,在您的情况下,您应该使用一个非贪婪的规则,尝试如下:

代码语言:javascript
运行
复制
FUNCTION:[\%][\%](.*?)[\%][\%];

注意问号

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47508970

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档