Java Parser-Generator满足这些要求

时间:2013-07-01 15:28:37

标签: java parser-generator

我一直致力于开发一种脚本语言,将java.awt.Graphics类中的方法移植到诸如
的命令中     

setcolor_0,127,214,255 //R,G,B,Alpha

    
fillrect_50,25,100,75 //x,y,w,h
进入图片,这样我就可以避免在每次想要创建某个图像时编写整个程序。语言本身目前仅限于伪函数和命令(直接映射到Graphics方法调用),还有一些输出说明符作为每个脚本的标题,但我想添加更多。该脚本在一个程序中处理,该程序既作为解析器又作为解释器,但我直接处理输入字符串的方法不适合我想做的事。

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

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

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

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

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

2 个答案:

答案 0 :(得分:1)

欢迎来到广泛的软件重用世界,您可以在众多组件中进行选择,所有这些组件都无法满足您的需求。

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

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

如果你坚持要求你仍然不想要这样的话,你可以随时hand-code a recursive descent parser。这对于“简单”语言特别有效,例如你的语言。 [你会发现你最终编写了自己的支持库,尽管它不一定非常大。]

答案 1 :(得分:0)

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

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

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

鉴于您需要的Java解析范围有限,您可能想要分析是否只需要一个正则表达式库就可以实现所需的内容。