Welcome

首页 / 软件开发 / .NET编程技术 / 使用ANTLR进行命令行参数解析

使用ANTLR进行命令行参数解析2011-09-16 博客园 Roland关于命令行参数的解析没有特定的规则,目前比较流行的有unix风格和微软风格。其实除了unix风格 的比较一致外,微软自己提供的命令行参数解析就有很多种风格。在.net平台下的main函数中,仅仅把参 数分解为以空格分割的数组,这对需要加开关,并且有的开关有自己的参数的情况是不够的,而且为了解 析这些参数需要学习部分词法分析的知识,这对用处不是很大的命令行参数显得有些“鸡肋”,当然用 Antlr来处理命令行参数更显得有些鸡肋,并且是大才小用,因为Antlr的语法规则比较复杂,学习起来有 一定的难度。但对于已经使用Antlr进行DSL开发的开发人员来说,解决命令行参数解析的问题是举手之劳 。

我们需要先定义命令行参数的输入规则,参考.Net framework提供的命令行工具,制定如下的规则:

1、以空格分割参数,与.net命令行参数保持一致。

2、选项(option)或者开关(switch)用/ 或 或 - 作为标志。

3、选项可以有参数,使用冒号:分割,选项的参数如果是多个使用逗号(,)或者分号(;)分隔。

4、选项之后是命令行自身的参数。

5、选项名称以英文字母开头。

6、选项的参数和命令行自身的参数可以使用英文字母和数字型、下划线,如果包含双字节码或者特殊 字符,需要使用双引号。

规则制定好以后,开始进入正题:

第一步,需要从Antlr网站(http://www.antlr.org)上下载Antlr类库及相关的学习资料及工具,工 具中比较重要的是Antlr works。

第二步,使用Antlr works或者文本编辑器编辑词法和语法规则:

grammar CmdPara;
options{
language=CSharp2;
output=AST;
ASTLabelType=CommonTree;
}
tokens{
Option;
}
cmdLine : String option* para* EOF!;
option
: swt ((":" para)((","|";")para)*)? ->^(Option swt para*);
swt : ("/"|"-"|"\") ID -> ID;
para : String|INT|ID;
ID : ("a".."z"|"A".."Z")(("a".."z")
|("A".."Z")
|"0".."9"
|"&"
|"/"
|"\"
|"."
|"_"
)*; //don"t support chinese
String : (""" .+ """)|(""" .+ """);
INT : ("1".."9")("0".."9")*
;
WS
: (" "|" "|" "|"u000C"|" ") {$channel=HIDDEN;}
;