Parsing 我应该如何解析有歧义的捆绑命令行选项?

Parsing 我应该如何解析有歧义的捆绑命令行选项?,parsing,command-line,ambiguity,Parsing,Command Line,Ambiguity,我正在创建一个命令行解析器,希望支持选项绑定。然而,我不确定如何处理可能出现的歧义和冲突。考虑以下三种情况: 一, 二, 三, 如何处理最后一个字符串?解析它有多种方法,所以我是只是抛出一个错误通知用户歧义,还是选择解析产生最多的字符串,即“-I-n 10-c lude” 我在网上找不到任何详细的约定,但我个人认为这是一个模糊错误。据我所知,在命令行参数解析方面没有标准,甚至没有跨平台共识。因此,我们所能做的最好的事情就是诉诸常识和法律 Posix标准提出了一些解析命令行参数的方法。它们只是指导

我正在创建一个命令行解析器,希望支持选项绑定。然而,我不确定如何处理可能出现的歧义和冲突。考虑以下三种情况:

一,

二,

三,

如何处理最后一个字符串?解析它有多种方法,所以我是只是抛出一个错误通知用户歧义,还是选择解析产生最多的字符串,即“-I-n 10-c lude”


我在网上找不到任何详细的约定,但我个人认为这是一个模糊错误。

据我所知,在命令行参数解析方面没有标准,甚至没有跨平台共识。因此,我们所能做的最好的事情就是诉诸常识和法律

Posix标准提出了一些解析命令行参数的方法。它们只是指导方针;如链接部分所示,一些标准shell实用程序不符合要求。尽管Gnu实用程序被期望符合Posix指南,但它们通常在某些方面也会出现偏差,包括使用“长”参数

在任何情况下,Posix对分组的定义是:

当分组在一个“-”分隔符后面时,应接受一个或多个不带选项参数的选项,后跟最多一个带选项参数的选项

请注意,Posix选项都是单字符选项。还请注意,该指南明确规定,只有选项组中的最后一个选项才允许是可能接受参数的选项

关于Gnu风格的长选项,除了
getopt_long
实用程序的行为之外,我不知道还有什么标准。该实用程序为单字符选项实现Posix样式,包括上述分组选项语法;它允许带有参数的单字符选项紧跟在参数后面,或者位于选项组(可能是单数)的末尾,参数如下所示

对于长选项,无论该选项是否接受参数,都不允许分组。如果该选项不接受参数,则允许使用两种样式:要么该选项后面紧跟着一个
=
,然后是该参数,要么该参数是下面的单词

在Gnu样式中,长选项不能与单字符选项混淆,因为长选项必须用两个破折号(
--
)指定

相比之下,许多基于TCL/Tk的实用程序(以及一些其他命令行解析器)允许使用单个
-
的长选项,但不允许选项分组

在所有这些样式中,选项分为两个不相交的集合:接受参数的集合和不接受参数的集合

这些系统中没有一个是模棱两可的,尽管像你所建议的那样,随机混合的风格可能是不明确的。即使使用正式的歧义消除规则,歧义也是危险的,特别是在命令行可能不可逆的控制台应用程序中。此外,如果将来扩展可用选项集,上下文消歧可能(甚至无声地)改变含义,这将是脚本中难以预测的错误的来源


因此,我建议坚持一种简单的现有实践,如Gnu,并且不要太过努力地解释不符合要求的错误命令行。

非常感谢您提供的有趣的见解和建议。我将进一步研究POSIX/Gnu指南,然后决定您提到的一个简单的现有实践。
-I accepts a string

"-Iinclude" -> Would be parsed as "-I include"
-I accepts a string
-n accepts an integer

"-Iincluden10" -> Would be parsed as "-I include -n 10" because the 'cluden10' after the first occurrence of 'n' cannot be parsed as an integer.
-I accepts a string
-n accepts an integer
-c accepts a string

"-Iin10clude" -> ??? What now ???