У меня есть командный файл, который использует внешнюю программу под названием 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).
Причина, по которой она не работает в XP или выше, заключается в том, что она должна записываться в блок окружения родительского процесса. Вместо этого, почему бы не изучить PowerShell или даже VBScript с WSF? – Ben
Но у меня есть много таких пакетных файлов, которые используют ASET. Я не хочу менять все эти файлы. – Sravan
У меня есть решение. I chanegd следующая строка $ res = ($ b.text) .toUpperCase(); следующим образом: $ res = ($ b.res) .toUpperCase(); – Sravan