下面是處理好的正則文法:
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ù)這個文法就可以快速的判斷語句的正確性了。先將輸入的所有字符串轉換為單詞(包括謂詞和小單詞)或名稱,可根據(jù)最后一個字母是否元音來判斷是單詞還是名稱,如果是名稱就直接轉為NAM,如果是單詞則需按上面的文法查表(有不用查表的小技巧,詳見代碼)。整個句子都轉換完成后,就要按照順序對符號進行推導,過程如下:
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,說明句法是正確的,否則就是錯誤的。推導的方法其實就是對動態(tài)數(shù)組進行插入和刪除的操作:如果一個符號可以直接推導出另一個符號,則直接改寫為推導出的符號;如果一個符號和前綴一起能推導出另一個符號,就將前綴刪除,當前符號改寫為推導出的符號;后綴的情況還有前后綴一起推導的情況也是一樣。具體算法詳見代碼的注釋,非常詳細。
程序中狀態(tài)轉換表的順序與上述推導順序相同(某些次序可以顛導,不影響結果的正確性,可能程序中略有不同)。符號枚舉類型中的符號名為符號的縮寫,對應如下:
UN: 未知/出錯
PS: predstring
P: preds
PN: predname
SE: sentence
VP: verbpred
PV: predverb
PC: predclaim
ST: statement
其它符號名與題目給出的相同。
本文導航
- 第1頁: 首頁
- 第2頁: Loglan 語言分析
- 第3頁: 下面是處理好的正則文法
- 第4頁: Loglan問題解決方案