0

我目前正在研究用 Java实现此处显示的语言。演示文稿有点长,但它本质上是一个用于创建动态语音的 DSL。例子:

rule ExampleRule
{
    criteria Criterion1 Criterion2 Criterion3=value
    response ExampleResponse
    remember State:=1
    trigger Object TriggerName
    ApplyFacts "State1:1:0,State2:1:0"
}
response ExampleResponse
{
    say "Text" then object ExampleRule
    say "Text" then any ExampleRule
    say "Text"
    scene "Scenepath"
}

我已经查看了不同的解析器生成器,例如 ANTLR、JavaCC 和 JFlex,但我想知道是否只使用 StringTokenizer/Scanner 并滚动我自己的解析器,因为它是用于业余项目的。

我之前决定使用 ANTLR,但在生成的源代码中使用完整路径名时遇到了一些 ANTLR 问题,而且运行时库似乎有点重量级。我找不到太多比较三个解析器库或内置 Java 替代方案的信息。

考虑到语言的性质,每个解析器的优点/缺点是什么?

4

3 回答 3

2

使用解析器生成器的优点:

  1. 构造的正确性。生成的解析器完全接受语法中指定的语言,从Knuth 1965开始,各种生成器都有各种 CS 证明。如果你自己滚动,例如递归下降,你没有直接的证据,也没有简单的方法来测试它。

  2. 开发时间。一旦您了解了生成器的弱点,解析器的构建速度就与您输入的速度一样快。

“鉴于语言的性质”并不是那么相关。主要从业者在 1960 年代实现算术表达式时犯了重大错误,这就是为什么我的观点 (1) 就是我的观点 (1)。

于 2012-12-12T06:55:58.190 回答
0

有四种类型的语言需要适当的自动化(识别)机制。StringTokenizer 和 Scanner 适用于常规语言(最简单的),但对于上下文无关语言(例如编程语言、XML 和其他包含嵌套结构的语言)则需要更高级的机制(例如下推自动机)。

如果没有非常详细的外观,在您的情况下,您最好使用 ANTLR 等工具。它们确实需要学习,但远不如学习如何为上下文无关语言创建自己的词法分析器和解析器。

于 2012-12-12T07:55:06.367 回答
-1

一般来说,这取决于你问的人群。

如果您与维护单个编译器的编译器人员交谈,遇到向后兼容性要求(在一个解析器中统一使用以前的版本或其他方言(-选项)),对解析速度有要求等,您通常需要递归下降(大多数生产编译器是RD)。

如果您谈论(也是专业的)编译器人员,他们通常会为另一个供应商的芯片定制 C 或 C++ 编译器,那么这些论点更像是 EJP。当然,他们通常采用他们已经拥有的 C(++) 标准语法,并添加一些架构定制结构。

于 2012-12-12T18:39:58.203 回答