關於JavaScript詞法


上篇博文發出來后感覺效果不是很好,遂寫篇文章來解釋解釋。本文可以認為是上篇文章 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基本就是全部詞法了,由它們之間的組合,可以組成表達式、語句、函數定義等語法結構,最終形成有強大表達能力的程序。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM