今天在做項目中腳本解析部分的時候,突然閃出了一個概念,就是語言中對變量名的定義,且看我在網(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/