如何在不使用正则表达式的情况下解析字符串

6

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

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

这将导致生成以下字符串:
asampletext

我希望能够定义一组可用的函数,包括语义参数等。我已经知道使用正则表达式如何实现这一点(或多或少)。
我的问题是:
  • 对于这样的目的,词法分析/语法分析是否比使用正则表达式更好,还是说我应该选择使用正则表达式并忘记它呢?
  • Java中是否已经存在这样的库?
  • 您是否知道任何展示示例解析/词法分析算法的教程?
谢谢!

5
是的,ANTLR是解决方案。你不应该使用正则表达式来进行语言解析的繁重工作。一个很好的例子在Stack Overflow上:https://dev59.com/HnI-5IYBdhLWcg3wSGQB - ring bearer
通常,为特定目的设计的这些自定义语言被称为领域特定语言 - Jesse Webb
3个回答

7
对于这样的目的,词法分析/语法分析是否比正则表达式更好一些,或者我应该只使用正则表达式并忘记它?
正则表达式无法表示递归语法,而您的语法似乎需要递归语法。如果是这种情况,则正则表达式根本无法解决问题。
Java中是否已经存在这样的库?
这不是库能够解决的问题。您需要使用解析器生成器系统(例如Antlr或Javacc)生成词法分析器和语法分析器,或几乎从头开始编写它们。前者可能更好……除非您已经参加了涵盖此领域的大学级课程或准备进行广泛阅读。
您是否知道任何显示一些示例解析/词法分析算法的教程?
Antlr和Javacc都有广泛的教程材料和示例。

0

当不仅限于Java时,您可以使用其他语言的PEG解析器或Rebol(它具有与PEG等效的“方言”)-或者回到Icon或Unicon,甚至现在是Object Icon,位于code.google.com/p/objecticon

当我意识到MIT Curl Web内容语言(www.curl.com)为用户选择了regexp时,这是一个遗憾的时刻,尽管Curl具有宏并提供对AST的访问。

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

Perl的使用赋予我们PCRE,因此除非需要(antlr和bison也有自己容易适应的地方),否则我们能做什么但避免它。

注意:Rebol、Icon和Curl都是基于表达式的语言(Icon具有有限的回溯)。

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

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

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

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

您可以在http://piumarta.com/software/peg/上找到Java相当于peg和leg的内容

CiteSeer上有Ralph Becket关于packrat解析和Mercury的文章(Google搜索“PEG parse mercury site:psu.edu”)

AdventuresInMercury博客中还有一系列三篇文章。


0
你可以尝试在JVM上使用Scala。 它使得创建DSL非常容易

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接