【问题标题】:Generator of Static Java Command Line Parser静态 Java 命令行解析器的生成器
【发布时间】:2012-10-29 12:05:24
【问题描述】:

我正在尝试为 Java 程序的命令行参数制作解析器,以免重新发明轮子我尝试寻找可以为我生成类似内容的生成器,我发现有人建议使用 CLI 和 JSAP,它们看起来像是很棒的工具,但它们在运行时创建对象,我需要我的解析是静态的,以免用不必要的功能(和内存)弄乱代码,所以我真正在寻找的是命令行解析器生成器,在那个线程中,我找到了 XTC、Rats 和 JavaCC,但它们看起来工作量很大,我认为我需要的更简单。

最后我决定使用 JavaCC 制作我的解析器,这个问题只是为了确保没有人知道更简单的方法......

谢谢

编辑:JavaCC 线程是个废柴,因为它逐个字符地工作,不太适合命令行解析

【问题讨论】:

  • 链接问题的答案有很多个命令行解析器库等例子
  • 恐怕你做的是过早的优化,万恶之源。由于命令行解析器只工作一次,它在运行时创建对象的事实是微不足道的。想想 JVM 本身,它在启动时创建了多少对象。

标签: java parsing parser-generator


【解决方案1】:

这个related SO question 对命令行解析器库有很多有用的建议。我想重点谈谈为什么经典的解析器生成器不是解决问题的好方法。

有两个根本原因:

  1. 命令行语法需要简单、易于记忆、与一般样式/约定中的其他命令行语法一致,并且具有最小的语法噪音。传统 PGS 的问题在于,每种语法都与其他语法不同,并且需要明确解析……这往往会导致句法噪音。 (好吧,如果你有纪律,你可以避免这些陷阱,但是......)

    相比之下,典型参数解析器库的 API鼓励程序员使用一致的风格;例如-x--longForm,选项优先,-- 表示没有更多选项,依此类推。而且因为“语言”不关心歧义,程序员可以随意地非正式地解决这个问题(没有过多的语法)或简化语法。

  2. 解析器生成器要么生成解析树,要么要求您将代码嵌入到语法中。这些都不是命令行解析的理想选择,因为它们都增加了应用程序代码的复杂性来处理这个问题。

    相比之下,典型的参数解析器库创建或填充平面数据结构,这更容易处理。


您似乎也过于担心性能和内存使用情况:

...我需要我的解析是静态的,以免用不必要的功能(和内存)弄乱代码

第一个观察结果是这可能无关紧要。与应用程序的其余部分相比,运行时对象的数量和大小很可能是微不足道的......以及在解析参数之前在正常 JVM 启动期间发生的所有隐藏的东西......以及之后。

第二个观察结果是,基于 PGS 的解决方案可能具有相当的开销。除了生成解析树(例如)之外,生成的解析器还需要初始化和保留一堆特定于语法的解析器表。当然,生成的解析器代码也往往很大。

【讨论】:

  • 我意识到基于 PGS 的解决方案也不是很好,因为代码生成器等待输入流并且通常逐个字符地工作,而 java 参数实际上是作为字符串数组传递的。
  • 我将分析我自己为几个参数编写的解析器,看看它是否具有与 CLI 相当的性能
  • @MysticOdin - 我认为你仍然没有“明白”我的观点和阿列克谢的观点。如果您的解析器用了 0.01 秒而 CLI 用了 0.1 秒,那仍然没有关系。您需要决定 1) 在整个应用程序运行时的上下文中,以及 2) 在您的应用程序的实际性能要求的上下文中。在没有人注意到差异的情况下花费 来优化命令行解析将是极大的浪费时间。
  • 我确实明白了您和 Alexei 的观点,特别是“过早优化”的事情,因为这仅在启动时完成,并且 JVM 可能会产生很多开销,您对典型程序运行时的观点是在我看来,我还需要比较检测参数错误所需的时间,因为对于我而言,这是一个关键问题,也是可执行 jar 的大小,我只想将这个问题进行到底,以获得支持我的具体数据决定,非常感谢您的关心澄清
猜你喜欢
  • 2018-09-22
  • 2012-07-27
  • 2021-01-07
  • 2010-09-25
  • 2013-11-20
  • 1970-01-01
  • 1970-01-01
  • 2016-02-11
  • 1970-01-01
相关资源
最近更新 更多