ANTLR解析器问题

ANTLR解析器问题,antlr,grammar,Antlr,Grammar,我试图解析一些文本记录,其中记录中的元素由“+”字符分隔,整个记录由“#”字符终止。例如E1+E2+E3+E4+E5+E6# 单个元素可以是必需的,也可以是可选的。如果一个元素是可选的,那么它的值就会丢失。例如,如果缺少E2,则输入字符串将是:E1++E3+E4+E5+E6# 但是,在处理空的尾随元素时,分隔符char(+)也可能丢失。例如,如果缺少最后3个元素,则字符串可以是:E1+E2+E3#,但也可以是: E1+E2+E3++# 我在Antlr中尝试了以下规则: “R1”“E1+E2+E3

我试图解析一些文本记录,其中记录中的元素由“+”字符分隔,整个记录由“#”字符终止。例如E1+E2+E3+E4+E5+E6#

单个元素可以是必需的,也可以是可选的。如果一个元素是可选的,那么它的值就会丢失。例如,如果缺少E2,则输入字符串将是:E1++E3+E4+E5+E6#

但是,在处理空的尾随元素时,分隔符char(+)也可能丢失。例如,如果缺少最后3个元素,则字符串可以是:E1+E2+E3#,但也可以是: E1+E2+E3++#

我在Antlr中尝试了以下规则:

“R1”“E1+E2+E3”“+”?”E4'?'+'?'E5'?'+'?'E6'?'#

但Antlr抱怨说,这是不明确的,当然是正确的(E3之后的每个标记都可能是E4、E5或E6)。输入语法是固定的(它来自遗留的大型机系统),所以我想知道是否有人能解决这个问题

另一种选择是在规则中指定所有不同的排列,但这将是一项主要任务

致以最良好的问候和感谢


Michael

如果这是不明确的,很可能是因为您的
E
s都具有相同的格式(更复杂的情况是,您的
E
s都是从相同的
k
字符开始,其中
k
是您的先行项,但我假设情况并非如此。如果是这样,这仍然有效;只需要额外的一步。)

因此,看起来您最多可以有6个
E
s和5个
+
s。我们将说“段”是可选的
E
,后跟一个
+
——您可以有5个段,以及可选的尾随
E

这种语法大致可以这样表示(ANTLR语法不完善,因为我不太熟悉):

如果ANTLR不支持类似于
{1,5}
的任何东西,那么这与:

(e_opt? PLUS) ((e_opt? PLUS) ((e_opt? PLUS) ((e_opt? PLUS) (e_opt? PLUS)?)?)?)?

这并不是很干净,所以可能有更好的方法来完成它。

对于ANTLR来说,这项任务听起来太过分了,有没有理由不使用“+”作为分隔符将字符串拆分成数组

如果它来自大型机,那么它很可能是以一种简单的方式进行处理的

e、 g.,
C++:BR> PHP:
Java:
C#:


只是想一想。

你能发布你所有的lexer规则吗?(假设不是那么多)
{a,b}
不受ANTLR支持。嘿,巴特,这是一个很好的提示-谢谢你的时间,我真的很感激。Brgds和谢谢,MichaelComment应该去“danben”-谢谢。但是你说得对。巴特。安特尔的正则表达式支持本可以更好。考虑到我们不知道他的表达式值(Es)是如何变化的解析,正则表达式可能不合适。嗨,Walt,对于一系列不同的消息、数据结构等,它比问题所暗示的要复杂,但无论如何还是要感谢。Brgds,Michael
(e_opt? PLUS) ((e_opt? PLUS) ((e_opt? PLUS) ((e_opt? PLUS) (e_opt? PLUS)?)?)?)?