3

我一直在开发一种脚本语言,它将java.awt.Graphics类中的方法移植到类似的命令中

setcolor_0,127,214,255 //R,G,B,Alpha
或者
fillrect_50,25,100,75 //x,y,w,h
成一张图片,这样我就可以避免每次想要创建某个图像时都必须编写整个程序。语言本身目前仅限于伪函数和命令(直接映射到 Graphics 方法调用),加上一些输出说明符作为每个脚本的标题,但我想添加更多。该脚本在一个同时用作解析器和解释器的程序中进行处理,但是我直接处理输入字符串的方法不足以满足我的需求。

虽然我搜索并发现了大量的解析器和词法分析器生成器,但我仍然遇到与解析器生成器相同的两个问题,即

  1. 生成的解析器将需要某种形式的运行时依赖(/-ies),只有生成器才能提供(例如:Beaver的产品需要自己的运行时文件),或者
  2. 生成器似乎还没有完全开发出来,或者如果不是这样,那么生成器仍然会做出至少一个令人不快的假设。(例如:Jay生成源代码的方法不包含类标记并假设所有类都在同一个文件中。)

所以除了避免这些事情之外,我还在寻找一个解析器生成器,它也有大量的开放文档(这就是我想避开 ANTLR 的原因),它输出 Java 源代码(我更喜欢输出尽可能使用最新版本的 Java,但这对我来说不是很重要)。

tl;博士:我需要一个解析器生成器:

  1. 与大量文档(外部或其他)一起免费提供。
  2. 构建解析器
    1. 不需要外部依赖项即可运行,
    2. 输出 Java 源代码(它是最新的(也许我可能会在 1.5 或更高版本中调用它?)并且易于阅读),以及
    3. 生成一个正确封装的类。

4

2 回答 2

1

欢迎来到软件重用的广阔世界,您可以在众多组件中进行选择,但所有组件都不能完全满足您的需求。

获得一个没有“外部依赖”的解析器生成器包可能是不现实的。几乎任何复杂的软件都使用特殊函数库来支持其用途,解析器生成器并没有真正的不同。你所做的区分似乎也相当人为。想象一下,解析器生成器只是简单地为外部库发出代码,而不是简单地引用它。您获得的代码量以及它的组织方式不会有所不同。那你为什么要反对库版本呢?

如果您想要不完整的解析器生成器,我建议您坚持使用成熟的解析器生成器。Java 世界中的 ANTLR 和 JavaCC 有着相当长的成功记录。

如果你坚持你仍然不想要这样的东西,你总是可以手动编写一个递归下降解析器。这对于“简单”语言尤其有效,例如您的语言。[您会发现最终编写了自己的支持库,尽管它不必很大。]

于 2013-07-02T09:22:38.627 回答
0

正如@Ira 所说,生成的解析器至少将依赖于使通用解析选项易于调用的运行时。另一种方法是将完全相同的运行时代码复制到每个生成的解析器中。

也就是说,我认为 JavaCC 的运行时要求最少:您可以从它的库中复制一个 CharStream 类。

不幸的是,生成的解析器的可读性与运行时的特性成反比。运行时间越少,级别越低,可读性越差。

鉴于您需要的 Java 解析范围有限,您可能想要分析您需要的内容是否可以仅使用 regexp 库来实现。

于 2013-07-02T14:48:21.957 回答