Thinker

            - long way to go...

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

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

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

          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ī)定其實就是為了編譯器便于進(jìn)行分析才這樣約束的. 語言越高級, 里面的語法約束就越多.  回復(fù)  更多評論
            

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

          # re: 程序語言中的變量名為什么不能以數(shù)字開頭 2007-07-27 15:23 FadeSky
          對應(yīng)該提升到有限狀態(tài)機(jī)這個深度
          不應(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é)計數(shù)?變量名?

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

          主站蜘蛛池模板: 宜川县| 渝北区| 崇仁县| 黄龙县| 高邮市| 泉州市| 台北市| 共和县| 嘉定区| 大渡口区| 洪泽县| 铜山县| 揭东县| 通海县| 顺义区| 曲阜市| 彭山县| 囊谦县| 南川市| 达州市| 繁昌县| 丰宁| 天峻县| 婺源县| 巢湖市| 乐东| 邹城市| 克什克腾旗| 岑溪市| 永新县| 中卫市| 玉环县| 望谟县| 金坛市| 钟祥市| 渑池县| 凤冈县| 吉隆县| 和田县| 当雄县| 南岸区|