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 では動作しません。そこで、少数の関数をサポートする 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)として出力を得ています..

4

2 に答える 2

2

コマンドライン引数は必要に応じて解析できます。あなたが提案している使用法は、コマンドライン引数の典型的な使用法ではないため、やりたいことに対する「正しい」手順は1つもありません。

あなたはあなた自身の文法を念頭に置いているようです(パスカルに基づいている可能性があります)ので、あなたの文法のためのパーサーと評価器を見つけるか書く必要があります。スケールの一端はANTLRのようなものです。または、 spracheでどこかに到達できます。

また、コマンド ライン パラメータの解析と処理に関するいくつかのアイデアについては、 http://commandline.codeplex.com/を参照する価値があるかもしれません(ただし、これで要件が満たされるとは思えません)。

于 2012-05-28T16:05:25.097 に答える
0

Windows 98 は 6 年間サポートされていません。ASET も同様です。

「Take Command」(4NT) で目的が達成されるかどうかはわかるかもしれませんが、それ以外の場合は、FreeDOS を搭載した VirtualBox が最善の策であると思います。

于 2012-05-29T09:04:00.050 に答える