Thinker

  - long way to go...

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  24 随笔 :: 0 文章 :: 143 评论 :: 0 Trackbacks
    今天在做项目中脚本解析部分的时候,突然闪出了一个概念,就是语言中对变量名的定义,且看我在网上搜索出来的关于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/
posted on 2007-07-16 15:09 Long 阅读(6277) 评论(18)  编辑  收藏 所属分类: Java

评论

# re: 程序语言中的变量名为什么不能以数字开头 2007-07-16 15:20 BeanSoft
还有很多语法规定其实就是为了编译器便于进行分析才这样约束的. 语言越高级, 里面的语法约束就越多.  回复  更多评论
  

# re: 程序语言中的变量名为什么不能以数字开头 2007-07-16 15:26 交口称赞
人是活得
机器是死的

机器永远无法知道人会怎么操作

所以很多时候80%的代码是为了去处理20%的情况。  回复  更多评论
  

# re: 程序语言中的变量名为什么不能以数字开头 2007-07-16 15:48 草鞋超人
"还真是没有没有原因的事情", 这句话还真是有点绕口啊,呵呵。不过还是很有道理的……  回复  更多评论
  

# re: 程序语言中的变量名为什么不能以数字开头 2007-07-16 16:08 Long
@草鞋超人
呵呵,笔头功夫差了点,还得多见谅:)  回复  更多评论
  

# re: 程序语言中的变量名为什么不能以数字开头 2007-07-16 18:54 开机
我好久没想过“为什么”之类的问题了,羡慕楼主能常常有这样的灵感。  回复  更多评论
  

# re: 程序语言中的变量名为什么不能以数字开头[未登录] 2007-07-17 10:02 Dingding
帮楼主补充一下,从编译原理的角度来看,标识符的分隔属于词法分析的职责。词法通常是正则的,好处是可以用一个简单的有限状态机实现词法分析程序,不需要预读和回溯,可以只根据当前读到的符号和所处的状态决定下一步的转移动作。  回复  更多评论
  

# re: 程序语言中的变量名为什么不能以数字开头 2007-07-17 10:28 Long
@Dingding
不错,正是由于词法分析器在读取第一个字符的时候,如果是数字它就无法判断当前是进入到了标识符状态还是数值常量这个状态了,所以就有了标识符不能以数字开头的限制。  回复  更多评论
  

# re: 程序语言中的变量名为什么不能以数字开头 2007-07-17 13:29 北贝笨狗
呵呵
知道你们说的词汇是什么,有印象,只怪自己在学校的时候没有好好上课,那门课还差点挂了!!!编译原理!!!!!!!!你们都是编语言的??????呵呵  回复  更多评论
  

# re: 程序语言中的变量名为什么不能以数字开头 2007-07-17 18:54 CowNew开源团队
很多事情看起来貌似“就应该这样”,但是仔细分析却发现其中蕴藏着非常精妙的东西。感谢Long的分享,学习中。  回复  更多评论
  

# re: 程序语言中的变量名为什么不能以数字开头 2007-07-19 19:31 pass86
不错不错,赞一个。  回复  更多评论
  

# re: 程序语言中的变量名为什么不能以数字开头 2007-07-26 11:44 en
没分析到点上,主要事因为1e,1L这样的token不能确定应该处理未数字还是变量......  回复  更多评论
  

# re: 程序语言中的变量名为什么不能以数字开头 2007-07-26 12:20 Long
@en
这位仁兄说的也没错
不过,呵呵,你可能没有看懂我在文中说的意思  回复  更多评论
  

# re: 程序语言中的变量名为什么不能以数字开头 2007-07-27 12:40 realzhang
@Long
我认为en看懂了你的意思,但是他指出了更特殊的问题。

其实,这个问题没那么复杂,就是编译器的规定。
因为允许数字开头的变量名会造成更大的麻烦,所以就不允许了,多简单。

Long和en的差别,在于对这个麻烦的理解深浅不同:
long只简单的认为1234这样的变量名无法区分是数字还是变量,但这个问题不仅仅是long讨论的数字开头的变量名了,而是——变量名全是数字的情况了,是数字开头的一种特殊的情况,说服力不够大。

其实en认为更重要的是如下的情况:

1234L : Long类型的?变量名?
0123 : 是八进制?变量名?
1.2e10 科学计数?变量名?
0x123 十六进制?变量名?

这造成了编译器的头晕,所以禁止之,多简单呀。不是吗?  回复  更多评论
  

# re: 程序语言中的变量名为什么不能以数字开头 2007-07-27 13:21 Long
@realzhang
感谢realzhang的回复,

不过,我认为关于变量名限制不能以数字开头还是要从编译原理的DFA这个角度来看,也就是说1234L,0x123和1234是一样的,它们并不是数字的特殊情况,换句话说就算是程序语言中没有类似1234L,0x123这样的数字表示形式,还是会限制不能以数字开头的。

因为词法分析器分析到一个Token的第一个字符的时候就需要知道自己进入到什么状态了,即使没有1234L,0x123这样的数字,也需要这样来规定。也是为了解析的简便性。

我在文中举例"1234"这个例子只是为了从最直观的角度来描述这个问题,给大家(尤其是没有接触过编译原理的朋友)一个初步的印象,而且还加颜色表示,呵呵,也许正因为这个原因让大家误解了我的真正意思。
  回复  更多评论
  

# re: 程序语言中的变量名为什么不能以数字开头 2007-07-27 13:28 Long
另外,也许是文中的
“好,如果你说分析器可以根据后面的字符来判断的话,那么如果下一个字符为字母,那么很容易就判断出当前Token属于变量名(我们暂且忽略保留关键字),但是当如果接下来的字符全都是数字那怎么办?分析器将无法判断,因为变量名的定义中允许数字的存在。”
这几句话描述的不好、表达的不好吧,呵呵。  回复  更多评论
  

# re: 程序语言中的变量名为什么不能以数字开头 2007-07-27 15:23 FadeSky
对应该提升到有限状态机这个深度
不应该只是浅显的用于区分123L是字符串还是数字  回复  更多评论
  

# re: 程序语言中的变量名为什么不能以数字开头 2007-07-28 23:22 realzhang
多谢回复,再学习一下。  回复  更多评论
  

# re: 程序语言中的变量名为什么不能以数字开头 2012-08-23 15:03 jkjj
@realzhang
1.2e10 科学计数?变量名?

变量名中不能有小数点。所以这个东东是个数。  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: