今天在做項目中腳本解析部分的時候,突然閃出了一個概念,就是語言中對變量名的定義,且看我在網上搜索出來的關于Java變量名的一段定義:“變量名是一個合法的標識符,它是字母、數字、下劃線或美元符"$"的序列,Java對變量名區分大小寫,
變量名不能以數字開頭,而且不能為保留字。合法的變量名如:myName、value-1、dollar$等。非法的變量名如:
2mail、room#、class(保留字)等,變量名應具有 一定的含義,以增加程序的可讀性。”定義中說的很清楚變量名不能以數字開頭,其實不但是Java語言這樣定義,所有的語言應該都是這樣定義的。那么它為什么不能以數字開頭呢?這應該要從編譯原理的角度來解釋了吧。
這是我今天在做腳本解析時突然想到的。先來說明一下我們的這個語法解析工具,要解析的腳本很簡單,只包括了&,|,~,=,!=,()和{}等操作符。開始時采用了編譯原理的那一套,畫NFA、DFA,找出狀態然后再寫詞法分析生成Token,接著語法分析將生成的Token根據語義生成語法樹,最后求值。后來想一想,這個腳本很簡單只需要一個一個字符判斷遇到不同類型的字符就進入到不同的子函數中進行處理,同時完成詞法解析和語法分析以及求值的過程。不過無論使用那種方法都需要根據讀入的字符來判斷當前進入到哪個Token里了,這就是問題的關鍵所在。
為什么說判斷字符屬于哪個Token是關鍵呢?假設我們取消掉了變量名定義中不能以數字開頭的限制,這時當詞法分析器進入到一個Token分析的起始狀態時,如果讀取的第一個字符為數字,那么詞法分析器是無法判斷它當前要分析的這個Token是變量名還是數字常量了。好,如果你說分析器可以根據后面的字符來判斷的話,那么如果下一個字符為字母,那么很容易就判斷出當前Token屬于變量名(我們暫且忽略保留關鍵字),但是當如果接下來的字符全都是數字那怎么辦?分析器將無法判斷,因為變量名的定義中允許數字的存在。
呵呵,上面也許說的比較繞口難于理解,用句簡單的話來講就是:
當分析"123"這個字符串的時候,如果變量名允許第一個字符為數字,分析器就不知道“123”該是數值常量還是變量名了。
以前只知道學過的語言中變量名的定義都是不能以數字開頭的,但是沒有深究其中的原因,
實際上根本就沒在意這里面還有原因。今天只是寫腳本解析的時候想到了這一點,呵呵,希望已經知道了的兄弟不要拿板磚扔我:)另外,如果你還知道其中其它的內幕,就提出來跟大家分享一下。
唉,還真是沒有沒有原因的事情,任何事情只要有人規定成文了,必定有其原因所在,也就是有其合理性所在,而我們在學習的過程中應該多多想為什么,不要放過每一個細節。其實每個細節后面都隱藏著極深極大的原理或者說是內幕,了解了這些細節我們在做其他事情的時候才能游刃有余。
http://www.tkk7.com/qujinlong123/