gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:51:12 24 4
gpt4 key购买 nike

我正在尝试使用 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

只要基于以下引用 http://danielveselka.blogspot.fr/2011/02/antlr-swift-fields-parser.html 的值字段中不允许使用冒号,我就可以编写语法来执行此操作

任何人都可以提供有关如何解决此问题的指导吗?

最佳答案

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

grammar Swift;

parse
: entries? EOF
;

entries
: entry ( LINE_BREAK entry )*
;

entry
: key value
;

key
: ':' DATA ':'
;

value
: line ( LINE_BREAK line )*
;

line
: ( DATA | SPACES ) ( COLON | DATA | SPACES )*
;

LINE_BREAK
: '\r'? '\n'
| '\r'
;

COLON
: ':'
;

DATA
: ~[\r\n: \t]+
;

SPACES
: [ \t]+
;

现在您需要做的就是将监听器附加到树遍历器并监听 enterEntry 事件并捕获key文本。操作方法如下:

public class Main {

public static void main(String[] args) throws Exception {

String input = ":20:REF123456\n" +
":72:Some narrative text which\n" +
"may contain new lines and\n" +
"occassionally other : characters\n" +
":80A:Another field";

SwiftLexer lexer = new SwiftLexer(new ANTLRInputStream(input));
SwiftParser parser = new SwiftParser(new CommonTokenStream(lexer));

ParseTreeWalker.DEFAULT.walk(new SwiftBaseListener(){
@Override
public void enterEntry(@NotNull SwiftParser.EntryContext ctx) {
String key = ctx.key().getText().replace(":", "");
String value = ctx.value().getText().replaceAll("\\s+", " ");
System.out.printf("key -> %s\nvalue -> %s\n================\n", key, value);
}
}, parser.parse());
}
}

运行上面的演示将在控制台上打印以下内容:

key   -> 20value -> REF123456================key   -> 72value -> Some narrative text which may contain new lines and occassionally other : characters================key   -> 80Avalue -> Another field================

关于java - 包含标记的 ANTLR 文本 - SWIFT 换行冒号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24414716/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com