Probleme argument argument linie

Am un fișier batch care utilizează un program extern numit ASET.exe (http://www.pement.org/sed/bat_env.htm) pentru a seta valorile la variabile. Acest lucru a fost folosit deoarece are câteva capabilități avansate decât comanda normală SET. ASET poate schimba șirul dat în diferite formate și apoi îl poate atribui. Are funcții precum UPPER (), Fread (), Lower (), stânga ().

c:\test> aset var := left('asdf',2) 

instrucțiunea de mai sus atribuie "ca" variabilei "var". Dar problema este că va funcționa numai în victoria 98 sau înainte de mașini. Acesta nu va funcționa în win NT sau în XP sau 2008. Deci, am decis să scriu un mic program ca ASET în C# care să susțină un număr mic de funcții. Citesc aceste comenzi sub formă de argumente de linie de comandă și le analizez, iar apoi folosind o buclă de buzunar și o casetă de comutare, reușesc să obțin rezultatul dorit într-o oarecare măsură. Dar nu reușesc să analizez corect toate tipurile de comenzi.

De exemplu: Nu pot să analizez corect acest lucru:

aset var := left(upper(fsdsf),2). 

Întrebarea mea este asta Care este procedura corectă pentru parsarea argumentelor liniei de comandă? Cum se disting numele funcțiilor, diversele comutatoare, operatorii? Folosirea "switch" este singura soluție pentru a apela o funcție bazată pe șirul de intrare?

Acesta este dosarul meu de gramatică

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;};

Acum, cum să obțină funcționalitate ca var: = superioară (superioară (fsf)) ?? Sunt obtinerea de ieșire ca UPPER (FSF) ..

0
Dar am multe astfel de fișiere batch care utilizează ASET. Nu vreau să schimb toate fișierele
adăugat autor Sravan, sursa
Am soluția. Am chanegd următoarea linie $ res = ($ b.text) .toUpperCase (); după cum urmează: $ res = ($ b.res) .toUpperCase ();
adăugat autor Sravan, sursa
Motivul pentru care nu funcționează în XP sau mai sus este că trebuie să scrie în blocul de mediu al procesului părinte. Mai degraba decat de a face asta de ce nu invata PowerShell sau chiar VBScript cu WSF?
adăugat autor Ben, sursa

2 răspunsuri

Windows 98 a rămas fără sprijin timp de 6 ani, la fel și ASET.

S-ar putea să vedeți dacă "Take Command" (4NT) va face ceea ce doriți, dar în caz contrar cred că un VirtualBox cu FreeDOS ar putea fi cel mai bun pariu.

0
adăugat

Puteți parsa argumentele liniei de comandă, oricum doriți. Utilizarea pe care o sugerați nu este o utilizare tipică pentru argumentele liniei de comandă, deci nu există o procedură "corectă" pentru ceea ce doriți să faceți.

Se pare că aveți propriul grammer în minte (ar putea fi bazat pe pascal, cred că), deci trebuie să găsiți sau să scrieți un parser și un evaluator pentru grammer. La un capăt al scării este ceva de genul ANTLR sau ați putea ajunge undeva cu sprache .

De asemenea, ar merita să aruncați o privire la http://commandline.codeplex.com/ pentru câteva idei despre parsarea și prelucrarea parametrilor liniei de comandă (deși mă îndoiesc că acest lucru va fi suficient pentru cerințele dvs.).

0
adăugat
Vă mulțumim pentru sugestia ur. Cerința mea este atât de complexă? Voi încerca să învăț ANTLR și să o folosesc :)
adăugat autor Sravan, sursa
Îmi pare foarte rău pentru întârzierea răspunsului. Am fost foarte ocupat. În această perioadă am încercat să învăț ANTLR și am reușit să înțeleg elementele de bază ale acestuia.
adăugat autor Sravan, sursa
Am creat un mic fișier de gramatică. Are o singură funcție. UPPER Upper (asdf) returnează ASDF Acum vreau funcționalitatea ca partea superioară (asdf) care întoarce ASDF .. Cum pot face asta?
adăugat autor Sravan, sursa
Aici este fișierul meu de gramatică ...
adăugat autor Sravan, sursa
Se pare că doriți să puteți evalua expresiile transmise din linia de comandă - este posibil să puteți obține un parser simplu, dar fără să cunoașteți sintaxa pe care doriți să o sprijiniți (nu știu ce sintaxă pentru aset este), nu pot fi sigur - ați putea să faceți ceva cu compilatorul/interpretul Boo
adăugat autor Martin Ernst, sursa