gpt4 book ai didi

java - 用 ANTLR 匹配任意文本(符号和空格)?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:19:48 35 4
gpt4 key购买 nike

如何匹配ANTLRv4中的任意文本?我的意思是文本,在编写语法时是未知的?

我的语法如下:

grammar Anytext;

line :
comment;

comment : '#' anytext;

anytext: ANY*;

WS : [ \t\r\n]+;

ANY : .;

我的代码如下:

    String line = "# This_is_a_comment";

ANTLRInputStream input = new ANTLRInputStream(line);

AnytextLexer lexer = new AnytextLexer(input);

CommonTokenStream tokens = new CommonTokenStream(lexer);

AnytextParser parser = new AnytextParser(tokens);

ParseTree tree = parser.comment();

System.out.println(tree.toStringTree(parser)); // print LISP-style tree

输出如下:

line 1:1 extraneous input ' ' expecting {<EOF>, ANY}
(comment # (anytext T h i s _ i s _ a _ c o m m e n t))

如果我改变任何规则

ANY : [ \t\r\n.];

它根本无法识别任何符号。

更新1

我最后没有结束行字符。

更新 2

所以,我明白了,不可能将任何文本与词法分析器匹配,因为词法分析器不允许多个类。如果我为任何符号定义词法分析器规则,它将隐藏所有其他规则或不起作用。

但问题依然存在。

那么如何在解析器级别匹配所有符号呢?

假设我有表格数据,我不想处理某些字段而忽略其他字段。如果我有 anytext 规则,我会写

infoline :
( codepoint WS 'field1' WS field1Value ) |
( codepoint WS 'field2' WS field2Value ) |
( codepoint WS anytext );

如果第 2 列包含 field1field2 值,我在这里解析行,否则忽略行。

如何实现这种方法?

最佳答案

重要的是要记住 ANTLR 会在解析器看到第一个标记之前将您的完整输入分解为标记(至少它是这样运行的)。您的词法分析器语法如下所示。

T__0 : '#'; // implicit token created due to the use of '#' in parser rule comment

WS : [ \t\r\n]+;

ANY : .;

对于您的输入,标记如下:

  1. #(输入T__0)
  2. [空格](输入WS)
  3. T(输入ANY)
  4. h(类型任何)
  5. i(输入任何)
  6. s(类型任何)
  7. _(输入任何)
  8. i(输入任何)
  9. s(类型任何)
  10. _(输入任何)
  11. a(输入任何)
  12. _(输入任何)
  13. c(类型任何)
  14. o(输入任何)
  15. m(输入任何)
  16. m(输入任何)
  17. e(输入任何)
  18. n(类型任何)
  19. t(输入任何)

您当前的语法无法解析,因为 comment 规则中不允许使用 WS 标记。如果你使用这个,它会解析这个输入(但是当你扩展你的语法时可能会遇到问题):

// remember that '#' is its own token
anytext: (ANY | WS | '#')*;

您可以做的是将 comment 更改为一个词法分析器规则,它使用 # 字符以及后面的任何内容(在本例中,到行尾):

grammar Anytext;

line : COMMENT;

COMMENT : '#' ~[\r\n]*;

WS : [ \t\r\n]+;

ANY : .;

关于java - 用 ANTLR 匹配任意文本(符号和空格)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16496579/

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