ANTLR4 将多行匹配到一个停用词,但不要使用它

ANTLR4 match multiple lines to a stop word, but don't consume it

我要解析以下文本文件,一行是标识符,下一行(+ N 行)是标识符的数据

!ident my.identifier(1)
!data my multi line
string data that can be very long
but does not have a end
!ident my.identifier(2)
!data just one line
!ident my.identifier(3) 

稍后我想知道 my.identifier=我的多 line\nstring..... (所以我能够识别我的标识符及其值)

文件以标识符开头,然后交替排列为 ident、data、ident、data....

我不确定如何"start"以及如何处理多行问题。

我的做法:

file: identData*;
identData: (ident) (data);
ident: IDENT field;
field: ~NL*;

data: DATA value;
value: //what happens here?


IDENT: '!ident';
DATA: '!data';

NL: '\r' '\n' | '\n' | '\r';

如果 ! 是下一个 dataident 语句的适当保护字符,则只使用该字符。

data: DATA value? ;
value: .*? ~[!]   ;

基本上,这表示 value 将匹配最长的字符串字符,包括 none,加上一个不是 ! 的字符。使 value 可选删除 data 具有 value.

的要求

更新更多详情

如果有人需要,读取多个数据/值对的完整解决方案:

allData: (dataItem)+;
dataItem: ident  identData;
ident: IDENT field;
field: ~NL*;

itendData: DATA data;
data: .*? ~IDENT;

IDENT: '!ident';
DATA: '!data';

NL: '\r' '\n' | '\n' | '\r';