指定された文法を使って、 "To be finalized ..."という行までファイル情報の下で正常に解析されました。しかし、 "完了するために..."の後にさらにデータを受け取ると、パーサは1-3レコードをスキップし、出力では最初のヘッダーと最後の2レコード(4-5)が得られます。繰り返しテキストに対してANTLR4解析が機能しない
質問:質問:すべてのデータを解析できるように、文法を変更するにはどうすればよいですか?
は、テキスト解析: は非常にあなたは、以下の問題に光に感謝(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をスキップしていますが、すべてのファイルが読み込まれています。
ANTLR 4.6を使用して'STRING'、' FUNCTION'などに9つの '無効なエスケープシーケンス'エラーがあります。投稿された文法はあなたのために働いていますか? – BernardK
ええ、それは私の仕事、@ BernardK – Kris