Thinker

            - long way to go...

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            24 隨筆 :: 0 文章 :: 143 評論 :: 0 Trackbacks
              今天在做項(xiàng)目中腳本解析部分的時(shí)候,突然閃出了一個(gè)概念,就是語言中對變量名的定義,且看我在網(wǎng)上搜索出來的關(guān)于Java變量名的一段定義:“變量名是一個(gè)合法的標(biāo)識(shí)符,它是字母、數(shù)字、下劃線或美元符"$"的序列,Java對變量名區(qū)分大小寫,變量名不能以數(shù)字開頭,而且不能為保留字。合法的變量名如:myName、value-1、dollar$等。非法的變量名如:2mail、room#、class(保留字)等,變量名應(yīng)具有 一定的含義,以增加程序的可讀性。”定義中說的很清楚變量名不能以數(shù)字開頭,其實(shí)不但是Java語言這樣定義,所有的語言應(yīng)該都是這樣定義的。那么它為什么不能以數(shù)字開頭呢?這應(yīng)該要從編譯原理的角度來解釋了吧。
              這是我今天在做腳本解析時(shí)突然想到的。先來說明一下我們的這個(gè)語法解析工具,要解析的腳本很簡單,只包括了&,|,~,=,!=,()和{}等操作符。開始時(shí)采用了編譯原理的那一套,畫NFA、DFA,找出狀態(tài)然后再寫詞法分析生成Token,接著語法分析將生成的Token根據(jù)語義生成語法樹,最后求值。后來想一想,這個(gè)腳本很簡單只需要一個(gè)一個(gè)字符判斷遇到不同類型的字符就進(jìn)入到不同的子函數(shù)中進(jìn)行處理,同時(shí)完成詞法解析和語法分析以及求值的過程。不過無論使用那種方法都需要根據(jù)讀入的字符來判斷當(dāng)前進(jìn)入到哪個(gè)Token里了,這就是問題的關(guān)鍵所在。
              為什么說判斷字符屬于哪個(gè)Token是關(guān)鍵呢?假設(shè)我們?nèi)∠袅俗兞棵x中不能以數(shù)字開頭的限制,這時(shí)當(dāng)詞法分析器進(jìn)入到一個(gè)Token分析的起始狀態(tài)時(shí),如果讀取的第一個(gè)字符為數(shù)字,那么詞法分析器是無法判斷它當(dāng)前要分析的這個(gè)Token是變量名還是數(shù)字常量了。好,如果你說分析器可以根據(jù)后面的字符來判斷的話,那么如果下一個(gè)字符為字母,那么很容易就判斷出當(dāng)前Token屬于變量名(我們暫且忽略保留關(guān)鍵字),但是當(dāng)如果接下來的字符全都是數(shù)字那怎么辦?分析器將無法判斷,因?yàn)樽兞棵亩x中允許數(shù)字的存在。
              呵呵,上面也許說的比較繞口難于理解,用句簡單的話來講就是:當(dāng)分析"123"這個(gè)字符串的時(shí)候,如果變量名允許第一個(gè)字符為數(shù)字,分析器就不知道“123”該是數(shù)值常量還是變量名了

              以前只知道學(xué)過的語言中變量名的定義都是不能以數(shù)字開頭的,但是沒有深究其中的原因,實(shí)際上根本就沒在意這里面還有原因。今天只是寫腳本解析的時(shí)候想到了這一點(diǎn),呵呵,希望已經(jīng)知道了的兄弟不要拿板磚扔我:)另外,如果你還知道其中其它的內(nèi)幕,就提出來跟大家分享一下。

              唉,還真是沒有沒有原因的事情,任何事情只要有人規(guī)定成文了,必定有其原因所在,也就是有其合理性所在,而我們在學(xué)習(xí)的過程中應(yīng)該多多想為什么,不要放過每一個(gè)細(xì)節(jié)。其實(shí)每個(gè)細(xì)節(jié)后面都隱藏著極深極大的原理或者說是內(nèi)幕,了解了這些細(xì)節(jié)我們在做其他事情的時(shí)候才能游刃有余。

          http://www.aygfsteel.com/qujinlong123/
          posted on 2007-07-16 15:09 Long 閱讀(6303) 評論(18)  編輯  收藏 所屬分類: Java

          評論

          # re: 程序語言中的變量名為什么不能以數(shù)字開頭 2007-07-16 15:20 BeanSoft
          還有很多語法規(guī)定其實(shí)就是為了編譯器便于進(jìn)行分析才這樣約束的. 語言越高級, 里面的語法約束就越多.  回復(fù)  更多評論
            

          # re: 程序語言中的變量名為什么不能以數(shù)字開頭 2007-07-16 15:26 交口稱贊
          人是活得
          機(jī)器是死的

          機(jī)器永遠(yuǎn)無法知道人會(huì)怎么操作

          所以很多時(shí)候80%的代碼是為了去處理20%的情況。  回復(fù)  更多評論
            

          # re: 程序語言中的變量名為什么不能以數(shù)字開頭 2007-07-16 15:48 草鞋超人
          "還真是沒有沒有原因的事情", 這句話還真是有點(diǎn)繞口啊,呵呵。不過還是很有道理的……  回復(fù)  更多評論
            

          # re: 程序語言中的變量名為什么不能以數(shù)字開頭 2007-07-16 16:08 Long
          @草鞋超人
          呵呵,筆頭功夫差了點(diǎn),還得多見諒:)  回復(fù)  更多評論
            

          # re: 程序語言中的變量名為什么不能以數(shù)字開頭 2007-07-16 18:54 開機(jī)
          我好久沒想過“為什么”之類的問題了,羨慕樓主能常常有這樣的靈感。  回復(fù)  更多評論
            

          # re: 程序語言中的變量名為什么不能以數(shù)字開頭[未登錄] 2007-07-17 10:02 Dingding
          幫樓主補(bǔ)充一下,從編譯原理的角度來看,標(biāo)識(shí)符的分隔屬于詞法分析的職責(zé)。詞法通常是正則的,好處是可以用一個(gè)簡單的有限狀態(tài)機(jī)實(shí)現(xiàn)詞法分析程序,不需要預(yù)讀和回溯,可以只根據(jù)當(dāng)前讀到的符號和所處的狀態(tài)決定下一步的轉(zhuǎn)移動(dòng)作。  回復(fù)  更多評論
            

          # re: 程序語言中的變量名為什么不能以數(shù)字開頭 2007-07-17 10:28 Long
          @Dingding
          不錯(cuò),正是由于詞法分析器在讀取第一個(gè)字符的時(shí)候,如果是數(shù)字它就無法判斷當(dāng)前是進(jìn)入到了標(biāo)識(shí)符狀態(tài)還是數(shù)值常量這個(gè)狀態(tài)了,所以就有了標(biāo)識(shí)符不能以數(shù)字開頭的限制。  回復(fù)  更多評論
            

          # re: 程序語言中的變量名為什么不能以數(shù)字開頭 2007-07-17 13:29 北貝笨狗
          呵呵
          知道你們說的詞匯是什么,有印象,只怪自己在學(xué)校的時(shí)候沒有好好上課,那門課還差點(diǎn)掛了!!!編譯原理!!!!!!!!你們都是編語言的??????呵呵  回復(fù)  更多評論
            

          # re: 程序語言中的變量名為什么不能以數(shù)字開頭 2007-07-17 18:54 CowNew開源團(tuán)隊(duì)
          很多事情看起來貌似“就應(yīng)該這樣”,但是仔細(xì)分析卻發(fā)現(xiàn)其中蘊(yùn)藏著非常精妙的東西。感謝Long的分享,學(xué)習(xí)中。  回復(fù)  更多評論
            

          # re: 程序語言中的變量名為什么不能以數(shù)字開頭 2007-07-19 19:31 pass86
          不錯(cuò)不錯(cuò),贊一個(gè)。  回復(fù)  更多評論
            

          # re: 程序語言中的變量名為什么不能以數(shù)字開頭 2007-07-26 11:44 en
          沒分析到點(diǎn)上,主要事因?yàn)?e,1L這樣的token不能確定應(yīng)該處理未數(shù)字還是變量......  回復(fù)  更多評論
            

          # re: 程序語言中的變量名為什么不能以數(shù)字開頭 2007-07-26 12:20 Long
          @en
          這位仁兄說的也沒錯(cuò)
          不過,呵呵,你可能沒有看懂我在文中說的意思  回復(fù)  更多評論
            

          # re: 程序語言中的變量名為什么不能以數(shù)字開頭 2007-07-27 12:40 realzhang
          @Long
          我認(rèn)為en看懂了你的意思,但是他指出了更特殊的問題。

          其實(shí),這個(gè)問題沒那么復(fù)雜,就是編譯器的規(guī)定。
          因?yàn)樵试S數(shù)字開頭的變量名會(huì)造成更大的麻煩,所以就不允許了,多簡單。

          Long和en的差別,在于對這個(gè)麻煩的理解深淺不同:
          long只簡單的認(rèn)為1234這樣的變量名無法區(qū)分是數(shù)字還是變量,但這個(gè)問題不僅僅是long討論的數(shù)字開頭的變量名了,而是——變量名全是數(shù)字的情況了,是數(shù)字開頭的一種特殊的情況,說服力不夠大。

          其實(shí)en認(rèn)為更重要的是如下的情況:

          1234L : Long類型的?變量名?
          0123 : 是八進(jìn)制?變量名?
          1.2e10 科學(xué)計(jì)數(shù)?變量名?
          0x123 十六進(jìn)制?變量名?

          這造成了編譯器的頭暈,所以禁止之,多簡單呀。不是嗎?  回復(fù)  更多評論
            

          # re: 程序語言中的變量名為什么不能以數(shù)字開頭 2007-07-27 13:21 Long
          @realzhang
          感謝realzhang的回復(fù),

          不過,我認(rèn)為關(guān)于變量名限制不能以數(shù)字開頭還是要從編譯原理的DFA這個(gè)角度來看,也就是說1234L,0x123和1234是一樣的,它們并不是數(shù)字的特殊情況,換句話說就算是程序語言中沒有類似1234L,0x123這樣的數(shù)字表示形式,還是會(huì)限制不能以數(shù)字開頭的。

          因?yàn)樵~法分析器分析到一個(gè)Token的第一個(gè)字符的時(shí)候就需要知道自己進(jìn)入到什么狀態(tài)了,即使沒有1234L,0x123這樣的數(shù)字,也需要這樣來規(guī)定。也是為了解析的簡便性。

          我在文中舉例"1234"這個(gè)例子只是為了從最直觀的角度來描述這個(gè)問題,給大家(尤其是沒有接觸過編譯原理的朋友)一個(gè)初步的印象,而且還加顏色表示,呵呵,也許正因?yàn)檫@個(gè)原因讓大家誤解了我的真正意思。
            回復(fù)  更多評論
            

          # re: 程序語言中的變量名為什么不能以數(shù)字開頭 2007-07-27 13:28 Long
          另外,也許是文中的
          “好,如果你說分析器可以根據(jù)后面的字符來判斷的話,那么如果下一個(gè)字符為字母,那么很容易就判斷出當(dāng)前Token屬于變量名(我們暫且忽略保留關(guān)鍵字),但是當(dāng)如果接下來的字符全都是數(shù)字那怎么辦?分析器將無法判斷,因?yàn)樽兞棵亩x中允許數(shù)字的存在。”
          這幾句話描述的不好、表達(dá)的不好吧,呵呵。  回復(fù)  更多評論
            

          # re: 程序語言中的變量名為什么不能以數(shù)字開頭 2007-07-27 15:23 FadeSky
          對應(yīng)該提升到有限狀態(tài)機(jī)這個(gè)深度
          不應(yīng)該只是淺顯的用于區(qū)分123L是字符串還是數(shù)字  回復(fù)  更多評論
            

          # re: 程序語言中的變量名為什么不能以數(shù)字開頭 2007-07-28 23:22 realzhang
          多謝回復(fù),再學(xué)習(xí)一下。  回復(fù)  更多評論
            

          # re: 程序語言中的變量名為什么不能以數(shù)字開頭 2012-08-23 15:03 jkjj
          @realzhang
          1.2e10 科學(xué)計(jì)數(shù)?變量名?

          變量名中不能有小數(shù)點(diǎn)。所以這個(gè)東東是個(gè)數(shù)。  回復(fù)  更多評論
            

          主站蜘蛛池模板: 轮台县| 裕民县| 长子县| 东阿县| 深泽县| 蕉岭县| 称多县| 那坡县| 江孜县| 汾阳市| 社旗县| 文昌市| 图们市| 罗源县| 云霄县| 白城市| 南京市| 开原市| 南涧| 杂多县| 格尔木市| 江油市| 沂源县| 姜堰市| 社会| 信宜市| 利津县| 宽城| 宜黄县| 任丘市| 江陵县| 同德县| 鱼台县| 威宁| 增城市| 金华市| 昌邑市| 白玉县| 鄂温| 中阳县| 盐城市|