<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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ù)語義生成語法樹,最后求值。后來想一想,這個腳本很簡單只需要一個一個字符判斷遇到不同類型的字符就進入到不同的子函數(shù)中進行處理,同時完成詞法解析和語法分析以及求值的過程。不過無論使用那種方法都需要根據(jù)讀入的字符來判斷當(dāng)前進入到哪個Token里了,這就是問題的關(guān)鍵所在。
        為什么說判斷字符屬于哪個Token是關(guān)鍵呢?假設(shè)我們?nèi)∠袅俗兞棵x中不能以數(shù)字開頭的限制,這時當(dāng)詞法分析器進入到一個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)該多多想為什么,不要放過每一個細節(jié)。其實每個細節(jié)后面都隱藏著極深極大的原理或者說是內(nèi)幕,了解了這些細節(jié)我們在做其他事情的時候才能游刃有余。

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

    評論

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

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

    機器永遠無法知道人會怎么操作

    所以很多時候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 開機
    我好久沒想過“為什么”之類的問題了,羨慕樓主能常常有這樣的靈感。  回復(fù)  更多評論
      

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

    # re: 程序語言中的變量名為什么不能以數(shù)字開頭 2007-07-17 10:28 Long
    @Dingding
    不錯,正是由于詞法分析器在讀取第一個字符的時候,如果是數(shù)字它就無法判斷當(dāng)前是進入到了標(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開源團隊
    很多事情看起來貌似“就應(yīng)該這樣”,但是仔細分析卻發(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
    我認為en看懂了你的意思,但是他指出了更特殊的問題。

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

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

    其實en認為更重要的是如下的情況:

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

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

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

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

    因為詞法分析器分析到一個Token的第一個字符的時候就需要知道自己進入到什么狀態(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ù)字的存在。”
    這幾句話描述的不好、表達的不好吧,呵呵。  回復(fù)  更多評論
      

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

    主站蜘蛛池模板: 91亚洲性爱在线视频| 亚洲精品无码成人片在线观看 | 亚洲自偷自偷偷色无码中文| 国产乱子伦片免费观看中字| 色视频色露露永久免费观看| 最近最新MV在线观看免费高清| 一个人免费高清在线观看| 性生交片免费无码看人| 女人张腿给男人桶视频免费版| 成年女人免费视频播放77777| 成人免费视频试看120秒| 大香人蕉免费视频75| 国产免费久久精品| 亚洲VA综合VA国产产VA中| 精品亚洲成α人无码成α在线观看| 亚洲人成无码网WWW| 国产日韩亚洲大尺度高清| 久久综合日韩亚洲精品色| 久久亚洲春色中文字幕久久久| 亚洲综合一区二区精品久久| 亚洲一区二区三区播放在线| 亚洲精品无码久久久久YW| 日本系列1页亚洲系列| 一级毛片大全免费播放| 日韩精品无码免费专区网站| 亚欧色视频在线观看免费| 成熟女人特级毛片www免费| 可以免费观看的一级毛片| 五月天婷婷免费视频| 国产成人精品免费视频大全| 免费污视频在线观看| 抽搐一进一出gif免费视频| 久久福利青草精品资源站免费| 久久国产高潮流白浆免费观看 | 日韩毛片在线免费观看| 天堂在线免费观看| 久久最新免费视频| 99久久综合精品免费| 免费无码一区二区三区蜜桃大| 久久久亚洲精品蜜桃臀| 亚洲精品不卡视频|