Skip to content

Commit c1fec8d

Browse files
committed
零・一版語法定義
1 parent af45f6f commit c1fec8d

5 files changed

Lines changed: 75 additions & 1 deletion

book/.vitepress/config.mts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,10 @@ export default defineConfig({
4747
text: "分詞",
4848
link: "/零.一版/分詞",
4949
},
50+
{
51+
text: "剖析(語法分析)",
52+
link: "/零.一版/剖析(語法分析)",
53+
},
5054
],
5155
},
5256
],
3.32 KB
Loading
6.32 KB
Loading
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
繼續觀察漢語「嫉妒使我面目全非」,分詞後得到「嫉妒」、「使」、「我」、「面目全非」。接下來,我們試著了解這些詞是如何組成一個句子的,這樣的組成是否合乎語法,試分析其句型,「嫉妒使我面目全非」在現代漢語中屬於「使」字句,其可拆解為:
2+
3+
名詞・**使**・名詞・形容詞
4+
5+
或可寫成:
6+
7+
主語・**使**・賓語・形容詞。
8+
9+
得到句型拆解後,可以依樣造句(有如小學作業),例如:
10+
11+
> 我面目的劇變使眾人心驚膽顫
12+
13+
注意到主語、形容詞未必是個單詞,也可以是多詞複合,如「我面目的巨變」還可以拆解成「我」「面目」「的」「劇變」。
14+
15+
這代表主語作為句子的一部分並非最小單位,還可以向下拆分:
16+
```
17+
主語 = 名詞 | 形容詞・名詞 | 名詞・的・名詞 | ...
18+
```
19+
20+
漢語有非常多句型,以下列出幾個常見的:
21+
22+
- 主語・動詞
23+
- 時光・逝去
24+
- 主語・動詞・受詞
25+
- 武林盟・滅・唐門
26+
- 主語・形容詞
27+
- 小明・天下無敵
28+
29+
想用有限句型就完全涵蓋漢語是幾乎不可能的,自然語言的語法剖析器存在於人們的腦子裡,無法強行一致,教育也只是儘量這些腦剖析器能大致相通。人的語言靈活多變,即使到了本世紀仍可能誕生新的句型、語法,而新語法誕生後,也不可能在一瞬間普及到每個人的腦子裡。學界一直在研究如何盡可能做好自然語言的剖析,雖然不可能完美,但已有許多具實用價值的成品,如中研院開發的[中文剖析器線上測試](https://parser.iis.sinica.edu.tw/),號稱能解析六萬多種句子結構,用它來剖析本文開頭的例句可得:
30+
31+
![嫉妒使我面目全非語法樹](../image/嫉妒使我面目全非語法樹.png)
32+
![我面目的劇變使眾人心驚膽顫語法樹](../image/我面目的劇變使眾人心驚膽顫語法樹.png)
33+
34+
## 法咒的語法定義
35+
36+
雖然不可能讓所有人腦子裡的語法剖析器完全相同,但讓所有人電腦裡的剖析器版本相同倒是有可能的,至少版本不同的時候可以強迫用戶更新!而且法咒的語法是人造的,能在創造之初就定義好法咒的語法,而非如自然語言一般只能事後歸納。
37+
38+
貧道現在就來定義零・一版音界咒的語法,回到範例:
39+
40+
```音界
41+
元.人數=(11+3)*4
42+
人數+1
43+
```
44+
45+
音界咒只有兩種句型,一是變數宣告式,一是算式,這兩種句型可以穿插出現,其(上下文無關)語法定義可寫為:
46+
47+
```語法
48+
音界咒 = 句 | 句・音界咒
49+
句 = 變數宣告式 | 算式
50+
```
51+
52+
第一個語法式 `音界咒 = 句 | 句・音界咒` 定義了一個音界咒檔案該有的樣子,它可以是 ``,也可以是 `句・音界咒`,此處的「・」代表``之後緊接著`音界咒`,由於左側跟右側皆有「音界咒」,因此這是個遞迴定義,意指`音界咒`可分解為`句・音界咒`,而`句・音界咒`又可再分解為`句・句・音界咒`,一直到無窮個`句・句・句・句・句...`都是合法的音界咒。
53+
54+
語法式`句 = 變數宣告式 | 算式`,則近一步定義了句的樣貌,其有兩種型態,可以是`變數宣告式`,也可以是`算式`,變數宣告式很容易,只有一種可能:
55+
56+
```語法
57+
變數宣告式 = "元"・"・"・變數・"="・算式
58+
```
59+
60+
算式則較為複雜,敏銳的道友可能已經注意到,算式也蘊含了遞回,。
61+
62+
```語法
63+
算式 = 運算元・運算子・運算元 | "("・算式・")"
64+
運算元 = 變數 | 數字 | 算式
65+
運算子 = "+" | "−" | "*" | "/"
66+
```
67+
`算式 = 運算元・運算子・運算元 | "("・算式・")"``算式`定義為`運算元・運算子・運算元`,而在算式兩側加上括號後,依然是合法括號,也就是說,`1+2``算式`,而`(1+2)``((1+2))``(((1+2)))`...也都是合法算式。
68+
69+
70+
思考題:有沒有辦法定義上下文無關語法,把同一層級的括號限制在一對,禁止`((1+2))``(((1+2)))`之無意義括號?

book/零.一版/編譯目標:精五門(RISC-V)真言極簡子集.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ mv 目標, 源 # 將目標暫存器的值設為源暫存器的值
8080
元.甲=(1+3)*4
8181
甲+1
8282
```
83-
編譯出的精五真言,其結束碼為音界咒中最後一行的值,在上述範例中,即是「甲+1」的值。
83+
編譯出的精五真言,其結束碼定義為:若最後一行是算式,則為算式求值結果,在上述範例中,即是「甲+1」的值。若最後一行是變數宣告,結束碼定義為該變數的值
8484

8585

8686
```assembly

0 commit comments

Comments
 (0)