歡迎來到電腦語法世界!
你有沒有想過,電腦是如何知道 "print('Hello')" 這樣的程式碼是正確的,但 "print Hello'" 卻是錯誤的呢?就像英文有語法規則一樣,程式語言也有語法 (Syntax) 規則。在本章中,我們將學習描述這些規則的兩種方式:語法圖 (Syntax Diagrams)(視覺化方式)和 巴科斯-諾爾範式 (Backus-Naur Form, 簡稱 BNF)(文字化方式)。
如果一開始覺得有點棘手,別擔心!把這些想像成語言的「食譜」。一旦你學會了這些秘密符號,你就能像專業人士一樣輕鬆閱讀和編寫這些規則了。
預備概念:語法 (Syntax) 指的僅僅是「遊戲規則」,即規定如何在特定語言中排列單字和符號。
1. 語法圖 (Syntax Diagrams)
語法圖是一種以視覺化方式呈現程式語言規則的方法,就像地圖或流程圖一樣。你只需要從左到右跟著箭頭走,就能知道什麼是合法的結構。
如何閱讀地圖
你需要認識兩種主要的圖形:
1. 圓形或橢圓形: 這些代表終結符 (Terminals)。這是「路的盡頭」,也就是出現在程式碼中的實際字元或單字(例如分號 ; 或單字 IF)。
2. 矩形: 這些代表非終結符 (Non-terminals)。這是其他規則的「佔位符」。如果你看到一個標示為「數字 (Digit)」的矩形,這意味著你需要去查看「數字」這條規則,看看該填入什麼內容。
類比:想像一張製作三明治的地圖。
- 圓形可能寫著 "番茄"(你只需要在那裡放上番茄)。
- 矩形可能寫著 "麵包"(你必須根據另一條規則來決定要用哪種麵包)。
路徑與選擇
- 直線: 你必須按照這個順序進行。
- 分支: 如果線路分岔,你可以選擇走哪條路。這代表一種 OR(或)的選擇。
- 迴圈: 如果線路在圖形上方往回繞,這意味著你可以隨意重複該部分內容。
快速回顧:
- 橢圓形/圓形: 實際值(終結符)。
- 矩形: 另一條規則(非終結符)。
- 箭頭: 你必須行進的方向。
2. 巴科斯-諾爾範式 (BNF)
如果語法圖是「圖片」,那麼 BNF 就是「教科書描述」。它使用特定的符號來定義語言規則。這也是你在考試中最常用到的格式。
關鍵符號
要理解 BNF,你只需要記住四個特殊符號:
1. \( ::= \) : 這代表「定義為」或「由...組成」。
2. \( | \) : 這代表「或 (OR)」。當有多個選擇時使用它。
3. \( < > \) : 這些括號包圍著非終結符(規則的名稱)。
4. 純文字: 任何不在括號內的內容都是終結符(實際的值)。
簡單範例
讓我們用 BNF 定義一個數字 (Digit) 和一個二進位數字 (Binary Digit):
\(
\(
這就是在告訴電腦:「二進位數字定義為 0 或 1。」
記憶小撇步:符號 \( ::= \) 看起來像是一對眼睛和一張嘴,它正在「告訴」你規則是什麼!
重點總結:BNF 是一套文字規則,我們將複雜項目(如整個程式)拆解為較小的項目(如語句),最後拆解為最小的項目(如字母和數字)。
3. 終結符 vs. 非終結符
這是一個很容易混淆的地方,讓我們來釐清它!
非終結符 \( (<...>) \):
這些是「標籤」。它們不是最終結果,就像購物清單上的「水果」一詞一樣。「水果」不是你吃的特定東西,它是一個包含蘋果、香蕉等的類別。
終結符:
這些是「最終產品」。它們是實際的字元,例如 "A"、"5" 或 "+"。一旦你到達終結符,規則就結束了。
要避免的常見錯誤:千萬別忘記在非終結符周圍加上 \( < > \) 括號!沒有它們,電腦會以為你在討論程式碼中的實際單字,而不是規則名稱。
4. 遞迴 (Recursion):「無限」規則
我們該如何定義長度不固定的事物,例如整數 (Integer)(可能是 5、50 或 500)?我們使用遞迴 (Recursion)。這就是一條規則引用它自身的情況。
整數規則
看看這條 BNF 規則:
\(
逐步解釋:
1. 整數可以只是一個單一的 \(
2. 或者它可以是一個 \(
3. 因為 \(
你知道嗎?這就是電腦科學家如何定義任何長度的「列表」,而不必編寫數百萬條個別規則的方法。
快速回顧框:
- 單一項目: \(
- 項目列表(遞迴): \(
5. 在語法圖與 BNF 之間轉換
你可能會被要求將語法圖轉換為 BNF,反之亦然。請遵循這些簡單的「翻譯」技巧:
如果你在圖中看到分支... 在 BNF 中使用 \( | \) 符號。
如果你在圖中看到矩形... 在 BNF 中使用 \( <...>) \) 括號。
如果你在圖中看到向後走的迴圈... 在你的 BNF 規則中使用遞迴。
重點總結:
語法圖和 BNF 的作用相同:它們都定義了語言的語法 (syntax)。語法圖是使用圓形(終結符)和矩形(非終結符)的視覺化地圖。BNF 是一個文字系統,使用 \( ::= \)(定義為)、\( | \)(或)以及用於規則的括號。遞迴是我們用來實現重複或不限長度的秘密武器。
最後鼓勵:練習畫畫看!試著為你自己的名字或簡單的電話號碼編寫 BNF 規則。你可以做到的!