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 では動作しません。そこで、少数の関数をサポートする ASET のような小さなプログラムを c# で作成することにしました。これらのコマンドをコマンド ライン引数として読み取って解析し、for ループと switch ケースを使用して、ある程度目的の結果を得ることができます。しかし、すべてのタイプのコマンドを適切に解析することはできません。
例:これを適切に解析できません:
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)) のような機能を実現する方法は?? 私はUPPER(FSF)として出力を得ています..