我有一個批處理文件,它使用名爲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)..
它在XP或以上版本中不起作用的原因是因爲它需要寫入父進程的環境塊。而不是這麼做,爲什麼不學習PowerShell,甚至不用WSF學習VBScript? – Ben
但我有很多使用ASET的批處理文件。我不想更改所有這些文件 – Sravan
我得到了解決方案。我提供以下行 $ res =($ b.text).toUpperCase(); 納入如下 $ res =($ b.res).toUpperCase(); – Sravan