我想知道Scalas/Haskells解析器组合子是否足以解析一种编程语言。更具体地说,是MiniJava语言。我目前正在阅读compiller construction和jflex,而使用java cup是相当痛苦的,所以我想知道我是否可以/应该使用解析器组合子来代替。MiniJava语法非常小。MiniJavas BNF:http://www.cambridge.org/us/features/052182060X/grammar.html
发布于 2009-07-08 21:58:58
Scala的解析器是一个回溯解析器,因此它可以处理几乎任何BNF或EBNF。然而,这也意味着,在一些边缘情况下,读取输入可能会非常慢。
如果语法可以更改为LL(1) grammar,则可以使用~!运算符将回溯保持到最小。
语法可能可以转换为LL(1),但正如所写的那样,它不是。例如,可以看到表达式和语句有First/First冲突(请在链接文章的末尾查看)。
无论如何,对于一个学术项目来说,这已经足够了。对于现实生活中的编译器,你需要更快的解析器。
发布于 2009-01-29 02:06:59
我从来没有使用过Scala,但是BNF的存在使得这一切变得很容易。
简单地翻译成哈斯克尔的Text.ParserCombinators.Parsec
goal = do c <- mainClass
cs <- many classDeclaration
eof
return $ c:cs
mainClass = do token "class"
name <- identifier
...等等。PArrows的转换也很简单。您可能会发现,在解析器之前使用不同的词法分析阶段会更容易一些,但是也可以不使用。
发布于 2009-01-29 20:52:52
我正在使用Scala的解析器组合子来解析PL/SQL代码,它的工作方式非常出色。
https://stackoverflow.com/questions/489783
复制相似问题