今天在做项目中脚本解析部分的时候,突然闪出了一个概念,就是语言中对变量名的定义,且看我在网上搜索出来的关于Java变量名的一段定义:“变量名是一个合法的标识符,它是字母、数字、下划线或美元符"$"的序列,Java对变量名区分大小写,
变量名不能以数字开头,而且不能为保留字。合法的变量名如:myName、value-1、dollar$等。非法的变量名如:
2mail、room#、class(保留字)等,变量名应具有 一定的含义,以增加程序的可读性。”定义中说的很清楚变量名不能以数字开头,其实不但是Java语言这样定义,所有的语言应该都是这样定义的。那么它为什么不能以数字开头呢?这应该要从编译原理的角度来解释了吧。
这是我今天在做脚本解析时突然想到的。先来说明一下我们的这个语法解析工具,要解析的脚本很简单,只包括了&,|,~,=,!=,()和{}等操作符。开始时采用了编译原理的那一套,画NFA、DFA,找出状态然后再写词法分析生成Token,接着语法分析将生成的Token根据语义生成语法树,最后求值。后来想一想,这个脚本很简单只需要一个一个字符判断遇到不同类型的字符就进入到不同的子函数中进行处理,同时完成词法解析和语法分析以及求值的过程。不过无论使用那种方法都需要根据读入的字符来判断当前进入到哪个Token里了,这就是问题的关键所在。
为什么说判断字符属于哪个Token是关键呢?假设我们取消掉了变量名定义中不能以数字开头的限制,这时当词法分析器进入到一个Token分析的起始状态时,如果读取的第一个字符为数字,那么词法分析器是无法判断它当前要分析的这个Token是变量名还是数字常量了。好,如果你说分析器可以根据后面的字符来判断的话,那么如果下一个字符为字母,那么很容易就判断出当前Token属于变量名(我们暂且忽略保留关键字),但是当如果接下来的字符全都是数字那怎么办?分析器将无法判断,因为变量名的定义中允许数字的存在。
呵呵,上面也许说的比较绕口难于理解,用句简单的话来讲就是:
当分析"123"这个字符串的时候,如果变量名允许第一个字符为数字,分析器就不知道“123”该是数值常量还是变量名了。
以前只知道学过的语言中变量名的定义都是不能以数字开头的,但是没有深究其中的原因,
实际上根本就没在意这里面还有原因。今天只是写脚本解析的时候想到了这一点,呵呵,希望已经知道了的兄弟不要拿板砖扔我:)另外,如果你还知道其中其它的内幕,就提出来跟大家分享一下。
唉,还真是没有没有原因的事情,任何事情只要有人规定成文了,必定有其原因所在,也就是有其合理性所在,而我们在学习的过程中应该多多想为什么,不要放过每一个细节。其实每个细节后面都隐藏着极深极大的原理或者说是内幕,了解了这些细节我们在做其他事情的时候才能游刃有余。
http://www.blogjava.net/qujinlong123/