2012-05-28 3 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) 

вышеуказанный оператор присваивает «как» переменной «var». Но проблема в том, что он будет работать только в win 98 или перед машинами. Он не будет работать в win NT или XP или 2008. Итак, я решил написать небольшую программу ASET в C#, которая поддерживает небольшое количество функций. Я читаю эти команды как аргументы командной строки и разбор их, а затем используя цикл for и switch, я могу в какой-то мере добиться желаемого результата. Но я не могу правильно разбираться для всех типов команд.

Для Eg: Я не могу разобрать это правильно:

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

Мой вопрос заключается в том, что Какова правильная процедура для разбора аргументов командной строки? Как различать имена функций, различные коммутаторы, операторы? Использование «switch» - единственное решение для вызова функции на основе входной строки?

Это мой Grammar файл

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 или даже VBScript с WSF? – Ben

+0

Но у меня есть много таких пакетных файлов, которые используют ASET. Я не хочу менять все эти файлы. – Sravan

+0

У меня есть решение. I chanegd следующая строка $ res = ($ b.text) .toUpperCase(); следующим образом: $ res = ($ b.res) .toUpperCase(); – Sravan

ответ

2

Вы можете проанализировать аргументы командной строки, как хотите. Использование, которое вы предлагаете, не является типичным использованием аргументов командной строки, поэтому нет никакой «правильной» процедуры для того, что вы хотите сделать.

У вас, кажется, есть свой собственный грамматик (может быть, на основе pascal, я думаю), поэтому вам нужно найти или написать парсер и оценщик для вашего грамматиста. На одном конце шкалы что-то вроде ANTLR, или вы могли бы где-нибудь с sprache.

Возможно, стоит взглянуть на http://commandline.codeplex.com/ на некоторые идеи по анализу и обработке параметров командной строки (хотя я сомневаюсь, что этого будет достаточно для ваших требований).

+0

Спасибо за предложение ur. Является ли мое требование настолько сложным? Я попытаюсь изучить ANTLR и использовать его :) – Sravan

+0

Похоже, вы хотите иметь возможность оценивать выражения, переданные из командной строки, - возможно, вы можете уйти с простым парсером, но не зная синтаксиса, который вы хотите (я не знаю, что такое синтаксис для aset), я не могу быть уверен - вы могли бы что-то сделать с компилятором/интерпретатором Boo –

+0

Мне очень жаль, что задержка в ответе. Я был очень занят.В этот период я ​​пытался изучить ANTLR, и я могу понять его основы. – Sravan

0

Windows 98 не поддерживается в течение 6 лет, и поэтому ASET.

Вы можете увидеть, будет ли «брать команду» (4NT) делать то, что вы хотите, но в остальном я думаю, что VirtualBox с FreeDOS может быть вашим лучшим выбором.

Смежные вопросы