C# 命令行参数问题

C# 命令行参数问题,c#,command-line-arguments,C#,Command Line Arguments,我有一个批处理文件,它使用一个名为ASET.exe的外部程序(http://www.pement.org/sed/bat_env.htm)将值设置为变量。之所以使用此命令,是因为它比正常的SET命令具有一些高级功能。ASET可以将给定的字符串更改为不同的格式,然后将其分配给它。它具有诸如UPPER()、Fread()、Lower()、left()之类的函数 上述语句将“as”赋值给变量“var”。但问题是它只能在Win98或之前的机器上工作。它在win NT、XP或2008中不起作用。因此,我决

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

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

例如:我不能正确地解析这个:

aset var := left(upper(fsdsf),2). 
我的问题是 解析命令行参数的正确过程是什么?如何区分函数名、各种开关、运算符?使用“开关”是基于输入字符串调用函数的唯一解决方案

这是我的语法文件

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))之类的功能??我得到的输出为上限(FSF)

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

您似乎有自己的语法(我想可能是基于pascal),所以您需要为您的语法找到或编写解析器和求值器。在天平的一端是这样的,或者你可以用它去某处


也可能值得一看,以获得一些关于解析和处理命令行参数的想法(尽管我怀疑这是否足以满足您的要求)。

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


您可能会看到“Take Command”(4NT)是否可以执行您想要的操作,但我认为带FreeDOS的VirtualBox可能是您最好的选择。

它在XP或更高版本中不起作用的原因是它需要写入父进程的环境块。与其这样做,为什么不使用WSF学习PowerShell甚至VBScript呢?但我有许多这样的批处理文件使用ASET。我不想更改所有这些文件,因为我找到了解决方案。我更改了以下行$res=($b.text).toUpperCase();如下所示:$res=($b.res).toUpperCase();谢谢你的建议。我的要求这么复杂吗?我将尝试学习ANTLR并使用它:)看起来您希望能够计算从命令行传入的表达式-您可能不需要一个简单的解析器,但不知道您想要支持的语法(我不知道aset的语法是什么),我不能确定-你也许可以用Boo编译器/解释器做些什么。我真的很抱歉回复的延迟。我很忙。在这段时间里,我试着学习ANTLR,我能够理解它的基本知识。我创建了一个小的语法文件。它只有一个功能。UPPER UPPER(asdf)返回asdf现在我需要类似UPPER(UPPER(asdf))返回asdf的功能。。我该怎么做?
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;};