如何解析没有正则表达式的字符串

时间:2012-09-16 00:30:56

标签: java regex string parsing lexer

我目前正在尝试创建一个能够解释动态字符串的软件组件,例如:

%TO_LOWER%(%DELETE_WHITESPACES%("A SAMPLE TEXT"))

这会产生这个字符串:

asampletext

我希望能够定义一组可用的函数,包括语义参数等。 我已经知道(或多或少)如何使用正则表达式。

我的问题是:

  • 为了这个目的,lexing /解析方式是否比regexp更好,还是我应该使用正则表达式并忘掉它?
  • 这样的库是否已经存在于Java中?
  • 您是否知道任何展示一些示例解析/ lexing算法的教程?

谢谢!

3 个答案:

答案 0 :(得分:7)

  

为了这个目的,lexing /解析方法是否比regexp更好,或者我应该使用正则表达式并忘掉它?

正则表达式无法表达递归语法,并且您的语法似乎需要递归语法。如果是这种情况,那么正则表达式根本无法解决问题。

  

这样的库是否已经存在于Java中?

这不是图书馆可以解决的问题。您需要使用解析器生成器系统(例如Antlr或Javacc)来生成词法分析器和解析器,或者从头开始虚拟地编写它们。前一种方法可能更好......除非你已经学习了涵盖这一领域的Uni-level课程,或者准备进行大量阅读。

  

您是否知道任何展示一些示例解析/ lexing算法的教程?

Antlr和Javacc都有广泛的教程材料和示例。

答案 1 :(得分:0)

当没有绑定到Java时,你可以使用另一种语言的PEG解析器或Rebol(它具有与PEG等效的解析“方言”) - 或者为Icon或Unicon或现在甚至是Object Icon达到WAY code.google.com/p/objecticon

很遗憾,当我意识到MIT Curl网页内容语言(www.curl.com)为用户选择了regexp时,即使Curl有宏并且可以访问AST。

一般主题:Parser Expression Grammar(PEG)和packrat解析。

Perl的使用给我们留下了PCRE,所以我们可以做什么,但在不需要的时候可以避免它(有antlr和野牛......毫无疑问,他们也有适合他们的地方)

注意:Rebol,Icon和Curl是基于表达式的语言(Icon具有有限的反向跟踪)。

其他选项包括Oz和Mercury(后者可以输出erlang)

我没有使用pyPEG,因为我只局限于Python 2.6.6;不再支持python解析Lepl - 但将安装2.6

Python中的解析选项包括http://theory.stanford.edu/~amitp/yapps/处的YAPPS和其他各种选项;注意:pyparsing无法在某些python环境中安装

对于Scala / Java,有这个PEG项目:https://github.com/sirthias/parboiled/wiki

根据http://piumarta.com/software/peg/

,您可能会发现Java等于peg和leg

CiteSeer有关于packrat解析的Ralph Becket文章和Mercury(google for PEG parse mercury site:psu.edu)

在AdventuresInMercury博客中还有一系列3篇博文。

答案 2 :(得分:0)

您可以尝试在JVM上使用ScalaIt makes it very easy to create DSLs.