2012-09-16 30 views
6

我目前正试图创建一个软件组件,将能够interprete动态字符串如:如何解析字符串没有正则表达式

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

这将导致该字符串:

asampletext 

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

我的问题是:

  • 是词法/这样一个目的解析方式比正则表达式更好,或者我应该去与正则表达式,而忘记了吗?
  • 这样的库在Java中是否已经存在?
  • 你知道任何教程显示一些示例解析/ lexing算法?

谢谢!

+5

是的,antlr是解决方案。你不应该使用正则表达式来解析语言。一个很好的例子是在堆栈溢出 - http://stackoverflow.com/questions/1931307/antlr-is-there-a-simple-example –

+0

通常,这些自定义语言为特定目的被称为[域特定语言](http ://en.wikipedia.org/wiki/Domain-specific_language)。 –

回答

7

对于这样的目的,lexing /解析的方式比regexp更好还是应该用正则表达式去忘记?

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

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

这不是库问题所解决的问题。您可能需要使用解析器生成器系统(如Antlr或Javacc)来生成词法分析器和解析器,或者从头开始虚拟编写它们。前者的方法可能会更好......除非你已经参加了涵盖该领域的统一级别主题,或准备进行大量阅读。

你知道任何教程显示一些示例解析/ lexing算法?

Antlr和Javacc都有丰富的教程资料和示例。

0

当不绑定到纯Java时,您可以使用另一种语言的PEG解析器或Rebol(它具有与PEG等效的解析“方言”) - 或返回WAY返回Icon或Unicon或现在甚至Object图标at code.google.com/p/objecticon

当我意识到MIT Curl网页内容语言(www.curl.com)为用户选择正则表达式时,即使Curl具有宏并提供访问到AST。

一般主题:解析器表达式语法(PEG)和一般的packrat解析。

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

注意:Rebol,图标和卷曲是基于表达式的语言(图标有限回溯)。

其他出-A-的方式选择包括奥兹和水星(后者可以输出二郎)我不使用pyPEG因为我只限于对Python 2.6.6

;蟒蛇解析Lepl不再支持 - 但将安装为2.6

Python中的解析选项包括YAPPS在http://theory.stanford.edu/~amitp/yapps/和其他各种;注意:pyparsing未能在安装一些Python env的

和斯卡拉/ Java的有这样PEG项目:https://github.com/sirthias/parboiled/wiki

你会发现每http://piumarta.com/software/peg/

CiteSeer一个Java当量,以PEG和腿部有拉尔夫贝克特文章packrat解析和水星(谷歌PEG解析汞网站:psu.edu)

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