是否有任何库或技术(任何语言版本)可以为任何类型的流或列表形式的数据(而不仅仅是字符串)提供类似正则表达式的工具?
例如,假设您正在为您喜爱的编程语言编写一个解析器。您已经将其词法化为代表令牌的Common Lisp对象列表。
您可以使用这样的模式来解析函数调用(使用C风格的语法):
(pattern (:var (:class ident)) (:class left-paren) (:optional (:var object)) (:star (:class comma) (:var :object)) (:class right-paren))
它将为函数名和每个函数参数绑定变量(实际上,它可能会被实现,以便此模式可能会绑定一个用于函数名的变量,一个用于第一个参数的变量,以及其他变量的列表,但这并不是一个真正重要的细节)。
这样的东西真的有用吗?
发布于 2009-09-29 04:22:58
我不知道您会收到多少关于这样一个主题的回复,因为大多数语言缺乏您心目中的那种健壮的流API;因此,大多数阅读本文的人可能不知道您在说什么。
Smalltalk是一个值得注意的例外,它附带了丰富的Stream类层次结构--再加上它的Collection类--允许您做一些非常令人印象深刻的事情。虽然大多数Smalltalk也提供了regex支持( Vassili Bykov的纯ST实现是一个流行的选择),但不幸的是,regex类没有像Collection类那样与Stream类集成在一起。这意味着在Smalltalk中使用流和正则表达式通常涉及从流中读取字符串,然后使用正则表达式模式单独测试这些字符串--而不是您脑海中可能想到的那种“读取下n个字符直到模式匹配”或“读取与此模式匹配的下n个字符”类型。
我认为一个强大的流API加上强大的regex支持将是非常棒的。然而,我认为你很难概括不同的流类型。字符串上的读取流不会带来什么困难,但文件和TCP流将有其自己的异常和延迟,您必须妥善处理这些异常和延迟。
发布于 2009-11-02 10:40:48
请尝试查看http://scala.sygneca.com/code/automata上的scala.util.regexp
文档和代码示例。例如,我认为这将允许计算语言学家通过查找词性模式来匹配单词串。
发布于 2009-11-02 12:45:52
这是大多数语法分析器背后的原则,语法分析器分两个阶段运行。第一个阶段是词法分析器,其中标识标识符、语言关键字和其他特殊字符(算术运算符、大括号等),并将其拆分为令牌对象,这些对象通常具有指示词位类型的数值字段,以及可选的另一个指示词位文本的字段。
在第二阶段,语法解析器对标记对象进行操作,仅通过魔术数字匹配它们,以解析短语。(执行此操作的软件包括Antlr、yacc/bison、Scala的cala.util.parsing.combinator.syntactical库以及许多其他软件)。这两个阶段并不完全相互依赖--您可以从您喜欢的任何其他地方获取令牌对象。不过,魔术数字方面似乎很重要,因为魔术数字被赋值给常量,它们使得用一种可读的语言表达语法变得容易。
请记住,使用正则表达式可以完成的任何操作也可以使用上下文无关文法来完成(通常也同样容易)。
https://stackoverflow.com/questions/1490245
复制相似问题