2012-05-28 230 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可能是您最好的選擇。