程序语言中的变量名为什么不能以数字开头

        今天在做项目中脚本解析部分的时候,突然闪出了一个概念,就是语言中对变量名的定义,且看我在网上搜索出来的关于Java变量名的一段定义:“变量名是一个合法的标识符,它是字母、数字、下划线或美元符”$”的序列,Java对变量名区分大小写,变量名不能以数字开头,而且不能为保留字。合法的变量名如:myName、value-1、dollar$等。非法的变量名如:2mail、room#、class(保留字)等,变量名应具有 一定的含义,以增加程序的可读性。”定义中说的很清楚变量名不能以数字开头,其实不但是Java语言这样定义,所有的语言应该都是这样定义的。那么它为什么不能以数字开头呢?这应该要从编译原理的角度来解释了吧。
        这是我今天在做脚本解析时突然想到的。先来说明一下我们的这个语法解析工具,要解析的脚本很简单,只包括了&,|,~,=,!=,()和{}等操 作符。开始时采用了编译原理的那一套,画NFA、DFA,找出状态然后再写词法分析生成Token,接着语法分析将生成的Token根据语义生成语法树, 最后求值。后来想一想,这个脚本很简单只需要一个一个字符判断遇到不同类型的字符就进入到不同的子函数中进行处理,同时完成词法解析和语法分析以及求值的 过程。不过无论使用那种方法都需要根据读入的字符来判断当前进入到哪个Token里了,这就是问题的关键所在。
        为什么说判断字符属于哪个Token是关键呢?假设我们取消掉了变量名定义中不能以数字开头的限制,这时当词法分析器进入到一个Token分析的起始状态 时,如果读取的第一个字符为数字,那么词法分析器是无法判断它当前要分析的这个Token是变量名还是数字常量了。好,如果你说分析器可以根据后面的字符 来判断的话,那么如果下一个字符为字母,那么很容易就判断出当前Token属于变量名(我们暂且忽略保留关键字),但是当如果接下来的字符全都是数字那怎 么办?分析器将无法判断,因为变量名的定义中允许数字的存在。
       呵呵,上面也许说的比较绕口难于理解,用句简单的话来讲就是:当分析”123″这个字符串的时候,如果变量名允许第一个字符为数字,分析器就不知道“123”该是数值常量还是变量名了
        总而言之,编译器在解析程序的时候,读到一个单词的第一个字符就需要知道当前这个单词属于那一类,这样方便于解析,不用回溯。

        以前只知道学过的语言中变量名的定义都是不能以数字开头的,但是没有深究其中的原因,实际上根本就没在意这里面还有原因。今天只是写脚本解析的时候想到了这一点,呵呵,希望已经知道了的兄弟不要拿板砖扔我:)另外,如果你还知道其中其它的内幕,就提出来跟大家分享一下。

        唉,还真是没有没有原因的事情,任何事情只要有人规定成文了,必定有其原因所在,也就是有其合理性所在,而我们在学习的过程中应该多多想为什么,不 要放过 每一个细节。其实每个细节后面都隐藏着极深极大的原理或者说是内幕,了解了这些细节我们在做其他事情的时候才能游刃有余。

 

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值