本帖最后由 qzwqzw 于 2012-3-7 17:10 编辑
1.qzwqzw
2.错误之处:5楼,首先,把一条完整的语句读入内存中(不管这条语句有多少行,它们都会被一起读入),然后,识别出哪些部分是命令关键字,哪些是开关、哪些是参数,哪些是变量引用……如果代码语法有误,则给出错误提示或退出批处理环境;如果顺利通过,接下来,就把该条语句中所有被引用的变量及变量两边的百分号对,用这条语句被读入内存之就已经赋予该变量的具体值来替换
3.改正:将“然后,识别出....顺利通过"删除
4.理由:- set "cs=&"
- set/p=test1<nul%cs%echo test2
-
- set sw=/l
- for %sw% %%i in (1,1,3) do echo %%i--
-
- set cmd=errorcmd
- %cmd%
-
- set errsw=/k
- dir %errsw%
复制代码 这个问题前几天就发现了
但是为了寻求理论上的确认花费了一些时间
经过数次跟踪分析
发现CMD的词法分析机制异常复杂
为此找了一些NT4下的cmd资料
NT4的CMD不支持变量延迟扩展和很多扩展特性
分析起来相对简单
但仍然没有得到确切的结论
大致可以得出的结论是
CMD首先分析了语句符号(包括() 和 @)
以及命令连接符号(顺序大致是& || && |)
再次分析for / if / rem / 其它命令 / 下级语句
在这些分析的过程中
如果遇到变量符号%则随时进行分析扩展
所以说cmd变量扩展和词法切分是混合进行的
很多特殊符号() | & 等会导致词法切分的退字符动作
%等符号会将缓冲区的字符指针重新定位
也就是说它们都会将命令缓冲区的Token串进行重整
以便在下一步的词法分析中可以继续对扩展结果进行切分和解析 |