Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 包含标记的ANTLR文本-SWIFT换行符冒号_Java_Parsing_Antlr_Grammar - Fatal编程技术网

Java 包含标记的ANTLR文本-SWIFT换行符冒号

Java 包含标记的ANTLR文本-SWIFT换行符冒号,java,parsing,antlr,grammar,Java,Parsing,Antlr,Grammar,我正在尝试使用ANTLR语法解析一些消息。消息包含以下结构: :20:REF123456 :72:Some narrative text which may contain new lines and occassionally other : characters :80A:Another field 目标输出是一个表,其中包含冒号之间的文本(作为“键”)和下一个键之前的文本(作为该键的值)。例如: Key | Values ---------------------------------

我正在尝试使用ANTLR语法解析一些消息。消息包含以下结构:

:20:REF123456
:72:Some narrative text which
may contain new lines and
occassionally other : characters
:80A:Another field
目标输出是一个表,其中包含冒号之间的文本(作为“键”)和下一个键之前的文本(作为该键的值)。例如:

Key | Values
--------------------------------------
20  | REF123456
72  | Some narrative text which
      may contain new lines and
      occassionally other : characters
80  | Another field
我可以编写一个语法来实现这一点,只要基于以下引用的值字段中不允许冒号


有人能提供如何解决这个问题的指导吗?

我会跳过v3,选择ANTLR v4。如何在v4中执行此操作的快速演示如下所示:

语法;
作语法分析
:参赛作品?EOF
;
条目
:条目(换行条目)*
;
进入
:键值
;
钥匙
:':'数据':'
;
价值
:行(行\断开行)*
;
线
:(数据|空格)(冒号|数据|空格)*
;
断线
:“\r”?”\不
|“\r”
;
结肠
: ':'
;
资料
:~[\r\n:\t]+
;
空间
:[\t]+
;
现在,您需要做的就是将一个侦听器连接到树漫游器,并侦听
enterEntry
出现的情况,并捕获
键和
文本。以下是如何做到这一点:

公共类主{
公共静态void main(字符串[]args)引发异常{
字符串输入=“:20:REF123456\n”+
“:72:某些叙述性文本\n”+
“可能包含新行和\n”+
“偶尔其他:字符\n”+
“:80A:另一个字段”;
SwiftLexer lexer=新的SwiftLexer(新的AntlInputStream(输入));
SwiftParser=newswiftparser(newcommontokenstream(lexer));
parsetRewalker.DEFAULT.walk(新的SwiftBaseListener(){
@凌驾
public void enterEntry(@NotNull SwiftParser.EntryContext ctx){
字符串key=ctx.key().getText().replace(“:”,”);
字符串值=ctx.value().getText().replaceAll(“\\s+”,”);
System.out.printf(“键->%s\n值->%s\n================\n”,键,值);
}
},parser.parse());
}
}
运行上述演示将在控制台上打印以下内容:

key -> 20 value -> REF123456 ================ key -> 72 value -> Some narrative text which may contain new lines and occassionally other : characters ================ key -> 80A value -> Another field ================ 按键->20 值->参考123456 ================ 键->72 值->一些可能包含新行和偶尔包含其他字符的叙述性文本:字符 ================ 按键->80A 值->另一个字段
===========================谢谢您如此全面的回答。这在v3中是可能的,还是您在语法中使用了v4特定的功能?语法本身可能很容易移植到v3,但是侦听器代码是v4特定的。我强烈建议您选择v4。谢谢,我在很多情况下都能做到这一点,但是如果字段数据中有一个数字后跟一个空格,则消息解析不正确,您知道原因吗?@niallsco提供了信息,不知道为什么会这样。