2

我正在制作一个将在 Scala 中解析命令的应用程序。命令的一个示例是:

todo get milk for friday

所以计划是让一个非常聪明的解析器将行分开并识别命令部分以及字符串中存在对时间的引用这一事实。

一般来说,我需要在 Scala 中制作一个标记器。所以我想知道我的选择是什么。我熟悉正则表达式,但我也计划制作类似 SQL 的搜索功能:

search todo for today with tags shopping

而且我觉得正则表达式将不灵活地执行具有很多变化的命令。这让我想到了实现某种语法。

在 Scala 中,我在这方面有哪些选择?

4

3 回答 3

9

您想搜索“解析器组合器”。我有一篇使用这种方法的博客文章(http://cleverlytitled.blogspot.com/2009/04/shunting-yard-algorithm.html),但我认为最好的参考是 Stefan Zieger 的这一系列文章(http:// /szeiger.de/blog/2008/07/27/formal-language-processing-in-scala-part-1/ )

于 2009-11-18T18:30:11.090 回答
2

这是我在 2009 年 9 月所做的关于 Scala 解析器组合器的演示文稿中的幻灯片。( http://sites.google.com/site/compulsiontocode/files/lambdalounge/ImplementingExternalDSLsUsingScalaParserCombinators.ppt ) 演示了一个简单的类 Logo 语言的实现。它可能会提供一些见解。

于 2009-11-18T20:17:55.600 回答
1

Scala 有一个解析器库 (scala.util.parsing.combinator),它使人们能够直接从其EBNF规范编写解析器。如果您的语言有 EBNF,那么编写 Scala 解析器应该很容易。如果没有,您最好先尝试正式定义您的语言。

于 2009-11-18T23:46:55.443 回答