上篇博文發出來後感覺效果不是很好,遂寫篇文章來解釋解釋。本文可以認為是上篇文章 JavaScript詞法(http://www.cnblogs.com/winter-cn/archive/2012/04/17/2454229.html)的掃盲說明:)
但凡語言,不論是自然語言還是程式語言,都大致可以區分詞法和文法。所謂詞,就是語言中有意義的最小單元。
常常聽到一個笑話,說“我英語學的可好啦,26個字母全認識!”。大家都知道,一切英文都是由26個字母組成的,為啥26個字母全認識,還不能說會英文呢?
答案就是字母不是詞,單獨的字母是沒有意義的,只有字母組成了詞,才會有表達意義的能力。所以學英語的時候,最重要的是"背單詞"。
別人問你,h是什麼意思啊?——h沒有任何意思,只有它出現在help,hello這樣的詞裡面,h才有意義。
對電腦語言來說,同樣的道理,每個Unicode或者ASCII字元都是沒有意義的,只有它們形成了"詞",才有意義。
所以對任何一門電腦語言來說,最基本的規則就是詞法,JavaScript裡面,所謂的"詞",實際上大家早已非常熟悉了,比如:
if while else for function之類的關鍵字
Cat Dog play等使用者定義的變數名,正式的叫法是標識符
"abc" 13.5 /abc/g true false等表示變數值的直接量
圓括弧 方括弧 花括弧 加號 等符號
斷行符號等分行符號
空格、Tab等空白符
注釋
經過很多年的發展,電腦語言的詞法定義基本形成了一個通用的套路。一般來講,一切合法的“詞”,被統稱作“輸入元素(InputElement)”。
輸入元素中,一切有意義的詞被稱作"token"(這個詞到目前為止沒有被廣泛接受的翻譯方法,所以保留),在一般的認識中,token以外的InputElement被掃描出來之後就可以直接丟棄了(當然實際情況是對大部分語言來說都是不行的,JavaScript也不行。)所以詞法剖析器,大部分叫做lexer,也有人喜歡叫做tokenizer。
除了真正有意義的token之外,其它InputElement都是起到修飾或者增加原始碼可讀性的作用。在JS中,就只有以下三種:
WhiteSpace:空白符
LineTerminator:行終結符
Comments:注釋
這三種都很好理解,是大家平時非常常用的東西。
大部分程式設計語言的詞法區別都體現在token上,JS的token其實也只有八種:
英文名 |
名稱 |
簡述 |
樣本 |
Token |
詞法標記 |
一切JS中有實際意義的詞法標記 |
|
┣IdentifierName |
標識名稱 |
以字母或_或$開始的一個單詞,可以用於屬性名稱 |
abc |
┃┣Identifier |
標識符 |
非保留字的IdentifierName,可以用於變數名或者屬性名稱 |
abc |
┃┣Keyword |
關鍵字 |
有特殊文法意義的IdentifierName |
while |
┃┣NullLiteral |
Null直接量 |
表示一個Null類型的值 |
null |
┃┗BooleanLiteral |
布爾直接量 |
表示一個Boolean類型的值 |
true |
┣Punctuator |
標點符號 |
表示特殊意義的標點符號 |
* |
┣NumericLiteral |
數字直接量 |
表示一個Number類型的值 |
.12e-10 |
┣StringLiteral |
字串直接量 |
表示一個String類型的值 |
"Hello world!" |
┗RegularExpressionLiteral |
Regex直接量 |
表示一個RegularExpression類的對象 |
/[a-z]+$$/g |
這些token基本就是全部詞法了,由它們之間的組合,可以組成運算式、語句、函數定義等文法結構,最終形成有強大表達能力的程式。