上篇博文發出來后感覺效果不是很好,遂寫篇文章來解釋解釋。本文可以認為是上篇文章 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 | 正則表達式直接量 | 表示一個RegularExpression類的對象 |  /[a-z]+$$/g  |  
          
這些token基本就是全部詞法了,由它們之間的組合,可以組成表達式、語句、函數定義等語法結構,最終形成有強大表達能力的程序。
