是否有任何库或技术(使用任何语言)为任何类型的流类或类似列表的数据(而不仅仅是字符串)提供类似正则表达式的工具?
例如,假设您正在为您的宠物编程语言编写解析器。你已经将它列入了代表令牌的Common Lisp对象列表。
您可以使用这样的模式来解析函数调用(使用C风格的语法):
(pattern (:var (:class ident)) (:class left-paren)
(:optional (:var object)) (:star (:class comma) (:var :object)) (:class right-paren))
这将绑定函数名称和每个函数参数的变量(实际上,它可能会实现,以便此模式可能绑定函数名称的变量,第一个参数的变量,以及休息,但这不是一个重要的细节。)
这样的事情会有用吗?
答案 0 :(得分:1)
我不知道你会在这样的主题上收到多少回复,因为大多数语言缺少你似乎想到的那种强大的流API;因此,大多数读这篇文章的人可能都不知道你在说什么。
Smalltalk是一个值得注意的例外,它带有丰富的Stream类层次结构 - 再加上它的Collection类 - 可以让你做一些令人印象深刻的东西。虽然大多数Smalltalks也提供正则表达式支持(Vassili Bykov的纯ST实现是一种流行的选择),但遗憾的是,正则表达式类没有像Stream类那样与Stream类集成。这意味着在Smalltalk中使用流和正则表达式通常涉及从流中读取字符串,然后使用正则表达式模式分别测试这些字符串 - 而不是“直到模式匹配时读取下一个n个字符”或“读取接下来的n个字符匹配”这种模式“你可能会想到的功能类型。
我认为强大的流API加上强大的正则表达式支持会很棒。但是,我认为你在推广不同的流类型方面遇到了麻烦。字符串上的读取流会带来一些困难,但文件和TCP流将有自己的异常和延迟,您必须优雅地处理它们。
答案 1 :(得分:0)
尝试查看scala.util.regexp
,包括API文档和http://scala.sygneca.com/code/automata上的代码示例。例如,我认为计算语言学家可以通过寻找部分语音模式来匹配单词串。
答案 2 :(得分:0)
这是大多数语法分析器背后的原理,它分两个阶段运行。第一阶段是词法分析器,其中标识符,语言关键字和其他特殊字符(算术运算符,大括号等)被识别并分成令牌对象,这些对象通常具有指示词位类型的数字字段,并且可选地指示另一个字段指示lexeme的文本。
在第二阶段,语法分析器对Token对象进行操作,仅通过幻数匹配它们来解析短语。 (用于执行此操作的软件包括Antlr,yacc / bison,Scala的cala.util.parsing.combinator.syntactical库以及许多其他库)。这两个阶段并不完全相互依赖 - 您可以从任何您喜欢的地方获取令牌对象。然而,神奇的数字方面似乎很重要,因为神奇的数字被分配给常数,它们使得用可读语言表达语法变得容易。
请记住,使用正则表达式可以完成的任何事情也可以通过无上下文语法完成(通常也很容易)。