6

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

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

这将导致这个字符串:

asampletext

我希望能够使用语义参数等定义一组可用函数。我已经(或多或少)知道如何使用正则表达式来做到这一点。

我的问题是:

  • 出于这样的目的,词法分析/解析方式是否比正则表达式更好,还是我应该使用正则表达式并忘记这一点?
  • Java 中是否已经存在这样的库?
  • 你知道任何显示一些示例解析/词法分析算法的教程吗?

谢谢!

4

3 回答 3

7

出于这样的目的,词法分析/解析方式是否比正则表达式更好,还是我应该使用正则表达式并忘记这一点?

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

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

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

你知道任何显示一些示例解析/词法分析算法的教程吗?

Antlr 和 Javacc 都有大量的教程材料和示例。

于 2012-09-16T02:55:04.057 回答
0

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

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

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

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

注意: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 and leg

CiteSeer 有关于 Packrat 解析和 Mercury 的 Ralph Becket 文章(谷歌 PEG 解析水星网站:psu.edu)

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

于 2013-06-11T16:14:43.313 回答
0

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

于 2013-06-11T16:53:04.577 回答