From 302849a18b49b1456d8b636b17a33680b9a864c5 Mon Sep 17 00:00:00 2001 From: MROS Date: Fri, 27 Sep 2024 23:05:49 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AA=9E=E6=B3=95=E7=9A=84=E6=AD=A7=E7=BE=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...3\345\220\214\347\265\220\346\236\234.png" | Bin 0 -> 28134 bytes ...25\345\210\206\346\236\220\357\274\211.md" | 63 ++++++++++++++++-- 2 files changed, 59 insertions(+), 4 deletions(-) create mode 100644 "book/image/\347\256\227\345\274\217\345\261\225\351\226\213\345\220\214\347\265\220\346\236\234.png" diff --git "a/book/image/\347\256\227\345\274\217\345\261\225\351\226\213\345\220\214\347\265\220\346\236\234.png" "b/book/image/\347\256\227\345\274\217\345\261\225\351\226\213\345\220\214\347\265\220\346\236\234.png" new file mode 100644 index 0000000000000000000000000000000000000000..bf8b25c439112c4b2da761adfdf0bde6961134f3 GIT binary patch literal 28134 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 uprBm`LH3Qz=b=Q!oS}HZ|NjBN?7Kez literal 0 HcmV?d00001 diff --git "a/book/\351\233\266\357\274\216\344\270\200\347\211\210/\345\211\226\346\236\220\357\274\210\350\252\236\346\263\225\345\210\206\346\236\220\357\274\211.md" "b/book/\351\233\266\357\274\216\344\270\200\347\211\210/\345\211\226\346\236\220\357\274\210\350\252\236\346\263\225\345\210\206\346\236\220\357\274\211.md" index cd545f8..d1d942a 100644 --- "a/book/\351\233\266\357\274\216\344\270\200\347\211\210/\345\211\226\346\236\220\357\274\210\350\252\236\346\263\225\345\210\206\346\236\220\357\274\211.md" +++ "b/book/\351\233\266\357\274\216\344\270\200\347\211\210/\345\211\226\346\236\220\357\274\210\350\252\236\346\263\225\345\210\206\346\236\220\357\274\211.md" @@ -57,14 +57,69 @@ 變數宣告式 = "元"・"・"・變數・"="・算式 ``` -算式則較為複雜,敏銳的道友可能已經注意到,算式也蘊含了遞回,。 +算式則較為複雜,敏銳的道友可能已經注意到,算式也蘊含了遞回。 ```語法 -算式 = 運算元・運算子・運算元 | "("・算式・")" -運算元 = 變數 | 數字 | 算式 +算式 = 變數 + | 數字 + | "("・算式・")" + | 算式・運算子・算式 運算子 = "+" | "−" | "*" | "/" ``` -`算式 = 運算元・運算子・運算元 | "("・算式・")"`將`算式`定義為`運算元・運算子・運算元`,而在算式兩側加上括號後,依然是合法括號,也就是說,`1+2`是`算式`,而`(1+2)`、`((1+2))`、`(((1+2)))`...也都是合法算式。 +`算式`可以只是一個變數或數字,`算式・運算子・算式`表明`算式`也可以是加減乘除的結果,`"("・算式・")"`,而在算式兩側加上括號後,依然是合法括號,也就是說,`1+2`是`算式`,而`(1+2)`、`((1+2))`、`(((1+2)))`...也都是合法算式,`0`、`(0)`、`((0))`也都合法。 思考題:有沒有辦法定義上下文無關語法,把同一層級的括號限制在一對,禁止`((1+2))`、`(((1+2)))`之無意義括號? + +為方便觀看,以下將音界咒零・一版全部語法定義寫在一起,並將其縮排: + +```語法 +音界咒 = 句 + | 句・音界咒 + +句 = 變數宣告式 + | 算式 + +變數宣告式 = "元"・"・"・變數・"="・算式 + +算式 = 變數 + | 數字 + | "("・算式・")" + | 算式・運算子・算式 + +運算子 = "+" + | "−" + | "*" + | "/" +``` + +## 語法歧義 +前文寫出的語法定義,定義的是如何**生成**合乎語法的字串,而非如何將字串的語法**剖析**出來。 + +這意思是說,當吾人想生成出所有(長度小於 n)的`算式`時,可以遍歷`算式`的兩個分支得到`變數宣告式`、`算式`兩種語法,這兩種語法又可以繼續分支下去,如此遞迴,便能得出所有(長度小於 n)的`算式`。 + +但是在遞迴遍歷的過程中,不同路徑很可能會造出重複的句子。 + +以`1+2*3`為例,其生成方式可能是`算式` => `算式+算式` => `算式+算式*算式`,先以`+`展開,接著展開後的第二個再以`*`展開,也可能是`算式` => `算式*算式` => `算式+算式*算式`,初始算式先以`*`展開,展開後的第二個算式再以`+`展開,如圖: + +![算式展開同結果](../image/算式展開同結果.png) + +一種語法出現不同展開過程但同結果這種情況,該語法就是「有歧義的」,亦有人稱「模糊」、「模稜兩可」、「二義性」。 + +歧義是一項不良性質,若對上圖中得到的兩棵語法樹做後序運算求值,所得將會不相同,一個是先乘除後加減,另個則是先加減後乘除。 + +即使語法存在歧義,還是有辦法剖析的,舉個例子,透過回溯來得到所有可能的語法樹,再依照某種方式挑選,如此還是能用一套算法總是從一套源碼中得到相同的語法樹。 + +遇到歧義與法時,也可以嘗試直接修原語法定義,寫出一套無歧義的語法。`算式`的例子可以透過額外增加`乘除式`、`原子式`兩層級來迫使先乘除後加減: + +``` +算式 = 乘除式 | 乘除式・加減・乘除式 +乘除式 = 原子式 | 原子式・乘除・原子式 +原子式 = 數字 + | 變數 + | "("・算式・")" +乘除 = "*" + | "/" +加減 = "+" + | "−" +```