我有一个批处理文件,它使用一个名为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中工作.所以,我决定在c#中编写一个像ASET这样的小程序,它支持一些少量的函数.我正在读取这些命令作为命令行参数并解析它们,然后使用for循环和switch case,我能够在某种程度上实现所需的结果.但我无法正确解析所有类型的命令.
对于Eg:我无法正确解析:
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)..
解决方法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。