C# 命令行参数问题
我有一个批处理文件,它使用一个名为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,我能够在某种程度上实现所需的结果。但我无法正确解析所有类型的命令 例如:我不能正确地解析这个: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 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;};