下面是處理好的正則文法:
A → a | e | i | o | u
MOD → ga | ge | gi | go | gu
BA → ba | be | bi | bo | bu
DA → da | de | di | do | du
LA → la | le | li | lo | lu
NAM → {all names}
PREDA → {all predicates} | PREDA PREDA
<sentence> → <statement> | <predclaim>
<predclaim> → <predname> BA <preds> | DA <preds>
<preds> → <predstring>
<predname> → LA <predstring> | NAM
<predstring> → PREDA | <predstring> A <predstring>
<predverb> → <predname> <verbpred>
<statement> → <predverb> <predname> | <predverb>
<verbpred> → MOD <predstring>
根據(jù)這個(gè)文法就可以快速的判斷語(yǔ)句的正確性了。先將輸入的所有字符串轉(zhuǎn)換為單詞(包括謂詞和小單詞)或名稱,可根據(jù)最后一個(gè)字母是否元音來判斷是單詞還是名稱,如果是名稱就直接轉(zhuǎn)為NAM,如果是單詞則需按上面的文法查表(有不用查表的小技巧,詳見代碼)。整個(gè)句子都轉(zhuǎn)換完成后,就要按照順序?qū)Ψ?hào)進(jìn)行推導(dǎo),過程如下:
PREDA → PREDA PREDA
<predstring> → <predstring> PREDA
<predstring> → PREDA
<predname> → NAM
<predname> → LA <predstring>
<verbpred> → MOD <predstring>
<preds> → <predstring> A <predstring>
<preds> → <predstring>
<predclaim> → <predname> BA <preds> | DA <preds>
<predverb> → <predname> <verbpred>
<statement> → <predverb> <predname> | <predverb>
<predclaim> → <sentence>
<statement> → <sentence>
如果最后能推得sentence,說明句法是正確的,否則就是錯(cuò)誤的。推導(dǎo)的方法其實(shí)就是對(duì)動(dòng)態(tài)數(shù)組進(jìn)行插入和刪除的操作:如果一個(gè)符號(hào)可以直接推導(dǎo)出另一個(gè)符號(hào),則直接改寫為推導(dǎo)出的符號(hào);如果一個(gè)符號(hào)和前綴一起能推導(dǎo)出另一個(gè)符號(hào),就將前綴刪除,當(dāng)前符號(hào)改寫為推導(dǎo)出的符號(hào);后綴的情況還有前后綴一起推導(dǎo)的情況也是一樣。具體算法詳見代碼的注釋,非常詳細(xì)。
程序中狀態(tài)轉(zhuǎn)換表的順序與上述推導(dǎo)順序相同(某些次序可以顛導(dǎo),不影響結(jié)果的正確性,可能程序中略有不同)。符號(hào)枚舉類型中的符號(hào)名為符號(hào)的縮寫,對(duì)應(yīng)如下:
UN: 未知/出錯(cuò)
PS: predstring
P: preds
PN: predname
SE: sentence
VP: verbpred
PV: predverb
PC: predclaim
ST: statement
其它符號(hào)名與題目給出的相同。
本文導(dǎo)航
- 第1頁(yè): 首頁(yè)
- 第2頁(yè): Loglan 語(yǔ)言分析
- 第3頁(yè): 下面是處理好的正則文法
- 第4頁(yè): Loglan問題解決方案