我正在使用Antlr4进行命令行解析
我的语法格式是
命令:subcommand1 | subcommand2
subcommand1:' sub1' option1 option2
子命令2:' sub2' option3 option4
选项1:' -option1' ID
选项2:' -option2' ID
选项3:' -option3' ID
选项4:' -option4' ID
ID:[a-zA-Z0-9] +
我希望每个子命令的选项对顺序不敏感
对于例如子命令-option1,ABC -option2 PQR应被视为有效输入
以及子命令-option2 PQR -option1 ABC也应被视为有效输入
改变语法的一种蛮力方式可能是
subcommand1:' sub1' (option1 option2 | option2 option1)
子命令2:' sub2' (option3 option4 | option3 option4)
但是这并不能使它成为通用的,并且添加一个选项将需要列出6个选项的排列。
有一种简单的方法吗?
答案 0 :(得分:3)
你应该使你的语法通用。不要在语法中对选项名称进行硬编码,而是生成通用词法分析器,然后在应用程序中解释选项名称。
我的意思是这样的:
grammar CommandLine;
command: ID option*;
option: OPTION ID;
OPTION: '-' ID;
ID : [a-zA-Z0-9]+;
然后使用代码提取选项名称。