2012-05-28 225 views
4

我有一个批处理文件,它使用名为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循环和切换大小写,我能够在某种程度上实现所需的结果。但我无法正确解析所有类型的命令。

对于如:我不能正确地解析此:

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功能:=上(上(FSF))?我得到输出为UPPER(FSF)..

+1

它在XP或以上版本中不起作用的原因是因为它需要写入父进程的环境块。而不是这么做,为什么不学习PowerShell,甚至不用WSF学习VBScript? – Ben

+0

但我有很多使用ASET的批处理文件。我不想更改所有这些文件 – Sravan

+0

我得到了解决方案。我提供以下行 $ res =($ b.text).toUpperCase(); 纳入如下 $ res =($ b.res).toUpperCase(); – Sravan

回答

2

不管你想要什么,你都可以解析命令行参数。您所建议的用法并不是命令行参数的典型用法,因此您想要执行的操作没有一个“正确”的过程。

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

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

+0

感谢您的建议。我的要求如此复杂吗?我将尝试学习ANTLR并使用它:) – Sravan

+0

看起来您希望能够评估从命令行传入的表达式 - 有可能您可以使用简单的解析器,但不知道您想要的语法支持(我不知道aset的语法是什么),我不能确定 - 你可能可以使用Boo编译器/解释器 –

+0

做些什么我非常抱歉在回复中的延迟。我变得很忙。在这段时间里,我试图学习ANTLR,我能够理解它的基础知识。 – Sravan

0

Windows 98已经退出了6年的支持,ASET也一样。

您可能会看到“Take Command”(4NT)是否会按照您的要求进行操作,但除此之外,我认为带有FreeDOS的VirtualBox可能是您最好的选择。