当前位置: 首页 > 知识库问答 >
问题:

Antlr任意字符直到字符串

相温文
2023-03-14

我想要一个带有ANTLR的规则,将任何字符解析为数字、字符串特殊('@space)等,直到单词FOOTER(不包括)

我要解析的文本是这样的

HEADER:
Date Id other stuff.
CONTENT 
... Any character
FOOTER
Other stuff
END

我尝试使用此代码:在词法分析器中。

HEADER:  'HEADER';
CONTENT: 'CONTENT';
FOOTER:  'FOOTER';
END:     'END';
ANY_CHARACTER: .* ~[FOOTER \r\n];

在解析器中。

HEADER ... The other rules
CONTENT ANY_CHARACTER 
FOOTER ...

但它不起作用。

共有2个答案

姜俊友
2023-03-14

我自己找到了解决办法。

.*? (FOOTER \r\n)

带。*我们接受所有字符,直到文件结束。

具有我们添加规则直到下一个规则为true,所以直到我们找到

(FOOTER \r\n)
吴英武
2023-03-14

一种可能的解决方案是lexer规则:

TRAILING_CONTENT: 'FOOTER' .*? 'END';

那么(当然)你需要从你的代币上去掉内容和结束部分。这是因为ANTLR标记化更喜欢匹配最长输入字符流的lexer规则(它确实假设它在您输入的其他任何地方都无效,因为它会将所有这些都收集到一个标记中)。

注意:这假设您的目标是解析一个输入文件,其中在内容和页脚之间会发生任何事情(除了结束),并且您希望将其视为单个标记,而不需要对其进行“解析”。(尽管可以通过内容的另一种语法来完成。)

 类似资料:
  • 我正在尝试编写一个ANTLR语法,用于解析字符串插值表达式,例如: 我得到的错误是: MyParser。g4: MyLemus. g4: 像以下这样的表达式可以正常工作: 知道我做错了什么吗?

  • 我将字符串作为解析器规则而不是词法分析器,因为字符串可能包含带有表达式的转义,例如。 这不起作用,因为

  • 我做了一个activity,从已安装的应用程序中选择一个应用程序,获得所选应用程序的启动器意图,并将该意图传递回一个起始activity: onActivityResult来自启动activity: 我从Logcat提取了startActivity内部的字符串和字符串:Intent{act=android.Intent.action.main cat=[Android.Intent.categor

  • 我想匹配string1和以下行中出现的任何内容: 直到遇到以下情况: 因此,在上述4种情况下,使用正确的正则表达式,粗体显示的结果将是匹配的: ['string 1','string 2','string 3'] [“字符串 1” , “字符串 2” , “字符串3”] ['string1.domain.com ',' string2.domain.com ',' string3.domain.c

  • 问题内容: 由于某种原因,我收到一条错误消息,但是实际上并没有在读取的任何代码中加下划线。我尝试清洁和重建它,但是没有用。它说它在第49行。 我的代码如下 下面的第49行 问题答案: 你内有两个“奇数”字- U + 200C (零宽不连字)和U + 200B (零宽度的空间)的第一个“e”和“m”个之间。“ l”和“ i”之间的“点击”中出现相同的字符。 只需删除并重新输入这些单词,错误就会消失。

  • 问题内容: 我有一个字符串(基本上是遵循命名约定的文件名) 我想在第一个(即一个点)之前提取子字符串 在java doc api中,我似乎找不到在String中执行此操作的方法。 我想念什么吗?怎么做? 问题答案: 看看和。 确保检查的-1 。