我有一个批处理文件,它使用名为ASET.exe(http://www.pement.org/sed/bat_env.htm)的外部程序来为变量设置值。之所以使用它是因为它具有比普通SET命令更高级的功能。ASET可以将给定的字符串更改为不同的格式,然后将其分配给变量。它拥有类似于UPPER()、Fread()、Lower()、left()的函数。
上面的语句将“as”赋值给变量“var”。但问题在于它只能在Win 98或之前的机器上运行。它在Win NT、XP或2008中无法工作。因此,我决定像c#中的ASET一样编写一个小程序,支持一些少量的函数。我将这些命令作为命令行参数读取并解析它们,然后使用for循环和switch case,以达到某种程度上的期望结果。但我无法正确解析所有类型的命令。
例如:我无法正确解析以下命令:
我的问题是:解析命令行参数的正确流程是什么?如何区分函数名、各种开关和运算符?使用“switch”是基于输入字符串调用函数的唯一解决方案吗?
这是我的语法文件。
现在该如何实现类似于 var := upper(upper(fsf)) 的功能呢?我得到的输出是 UPPER(FSF)。
c:\test> aset var := left('asdf',2)
上面的语句将“as”赋值给变量“var”。但问题在于它只能在Win 98或之前的机器上运行。它在Win NT、XP或2008中无法工作。因此,我决定像c#中的ASET一样编写一个小程序,支持一些少量的函数。我将这些命令作为命令行参数读取并解析它们,然后使用for循环和switch case,以达到某种程度上的期望结果。但我无法正确解析所有类型的命令。
例如:我无法正确解析以下命令:
aset var := left(upper(fsdsf),2).
我的问题是:解析命令行参数的正确流程是什么?如何区分函数名、各种开关和运算符?使用“switch”是基于输入字符串调用函数的唯一解决方案吗?
这是我的语法文件。
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)。