是否可以将ANTLR3语法转换为正则表达式?

时间:2011-03-15 19:59:02

标签: java antlr antlr3

我有一个ANTLR3简单语法分析器,它接受短行文本并将它们转换为Java对象。接下来,我有一个很大的文本行列表。其中一些(少于1%)可以转换,因为它们符合语法。

我需要通过解析器传递所有这些,以便了解哪些是可转换的,并创建Java对象的集合。操作非常耗时。在发送到ANTLR3之前,通过正则表达式传递它们会更有效。

我自己可以创建这样的正则表达式,但从ANTLR3解析器动态获取它会好得多。有可能吗?

2 个答案:

答案 0 :(得分:4)

通常,只有常规语言可以使用描述它们的正则表达式。 (大多数RE引擎支持与某些非常规语言匹配的功能(例如通过反向引用),但仍然不是所有无上下文甚至是一般的正式语言。)

我不是一个真正的专家,但我认为它的语法可以匹配不可匹配的语言。

所以,即使你的问题的理论上的可解性也没有给出,这取决于语法。

可能是那个

  • 你的语法实际上是一种常规语法,或者
  • 有一种常规语言,它是你的语法语言的略微超集 - 因此RE可以过滤掉大多数不匹配的行,而有些只会被语法/解析器过滤掉。

如果没有看到你的语法,很可能没有办法确定。

此外,正则表达式不一定比解析器快。

答案 1 :(得分:1)

具体来说,ANTLR可以解析LL(*)context free grammars子类。

要判断您的语言是否为常规,请查看您是否可以应用pumping lemma for regular languages