我目前正在尝试创建一个能够解释动态字符串的软件组件,例如:
%TO_LOWER%(%DELETE_WHITESPACES%("A SAMPLE TEXT"))
这会产生这个字符串:
asampletext
我希望能够定义一组可用的函数,包括语义参数等。 我已经知道(或多或少)如何使用正则表达式。
我的问题是:
谢谢!
答案 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和legCiteSeer有关于packrat解析的Ralph Becket文章和Mercury(google for PEG parse mercury site:psu.edu)
在AdventuresInMercury博客中还有一系列3篇博文。
答案 2 :(得分:0)
您可以尝试在JVM上使用Scala。 It makes it very easy to create DSLs.