命令行参数问题

时间:2012-05-28 15:54:05

标签: c# command-line-arguments

我有一个批处理文件,它使用名为ASET.exe的外部程序(http://www.pement.org/sed/bat_env.htm)来设置变量值。之所以使用它,因为它具有一些比普通SET命令更高级的功能。 ASET可以将给定的字符串更改为不同的格式,然后将其分配给它。它有像UPPER(),Fread(),Lower(),left()这样的函数。

c:\test> aset var := left('asdf',2) 

上述语句将“as”赋给变量“var”。但问题是它只能在win 98或机器之前工作。它不会在win NT或XP或2008中工作。所以,我决定在c#中编写一个像ASET这样的小程序,它支持一些少量的函数。我正在读取这些命令作为命令行参数并解析它们,然后使用for循环和switch case,我能够在某种程度上实现所需的结果。但我无法正确解析所有类型的命令。

对于Eg:我无法正确解析这个问题:

aset var := left(upper(fsdsf),2). 

我的问题是 解析命令行参数的正确过程是什么?如何区分功能名称,各种开关,运营商?使用“switch”是根据输入字符串调用函数的唯一解决方案?

这是我的语法文件

grammar sra;

options {

  language = Java;
  output = AST;
}

start returns [String res]: expression 
{
$res=$expression.res;
System.out.println("value equals at start: "+$expression.text+$res);
} ;

expression returns [String res]
: Identifier Assignop statement
{$res=$statement.res;
System.out.println("value equals at ecpression: "+$statement.text+" "+$res);}
;

statement returns [String res]
  : function {$res=$function.res;
  System.out.println("value equals at statement: "+$function.text+" "+$res);}

  //|function Plus function
  //|function Plus Identifier
  //|Identifier
  //|Identifier Plus Identifier
  ;


   function returns [String res]
  : e=upper {$res=$e.res;
  System.out.println("value equals at function: "+$e.text+" "+$res);}  
  ;
upper returns [String res]
  : e=Upper '(' b=arguments   ')'
  {
  System.out.println("argum before conver "+$b.text);
  $res= ($b.text).toUpperCase();
  System.out.println("value equals at upper: "+$e.text+" "+"Arguments="+$b.text+" "+$res); }

  ;
arguments  returns [String res]     
                :   e1=Identifier   {$res=$e1.text;}
                |  function  {$res=$function.res;} 
                ;


Upper : 'upper';
Lower : 'lower';

Identifier  :  ('a'..'z'|'A'..'Z')('a'..'z'|'A'..'Z'|'0'..'9')*;
Assignop :':=' ;

Lparen  : '(';
Rparen  : ')';
Plus  : '+';
WS  : (' '|'\t'|'\r'|'\n')+{$channel = HIDDEN;};

现在如何实现var:= upper(upper(fsf))等功能?我输出为UPPER(FSF)..

2 个答案:

答案 0 :(得分:2)

您可以根据需要解析命令行参数。您建议使用的用法不是命令行参数的典型用法,因此没有一个“正确”的过程可用于您想要做的事情。

你似乎有自己的语法,(我猜可以基于pascal),所以你需要为你的语法找到或编写一个解析器和评估器。在比例的一端是ANTLR,或者你可以到sprache的某个地方。

对于解析和处理命令行参数的一些想法,也值得一看http://commandline.codeplex.com/(虽然我怀疑这对你的要求是否足够)。

答案 1 :(得分:0)

Windows 98已经失去了6年的支持,ASET也是如此。

您可能会看到“Take Command”(4NT)是否可以满足您的需求,但我认为使用FreeDOS的VirtualBox可能是您最好的选择。