我真的不用瘋狂使用編譯器語法來實現DSL--對不起,我知道一些人喜歡它,我很樂意承認這是一個可愛的技巧,但是編寫自己的解析器非常容易,爲什麼不呢做它?然後,您的文本中不會有隨機逗號和下劃線。
下面是一個簡單的竅門,我用來實現一個簡單的語法像你描述的一個:
首先,看你的命令 - 注意,大部分是在「動詞名詞PARAMS」格式
此映射真的很好地方法名,對象名,則params
所以一個很好的程序是:
split sentence into string array s
for a line with a single word (if s.length == 1):
instantiate an object with that name
call a default method on that object
done
for a line with more than one word
instantiate the object s[1]
call method s[0] with s[2...] as parameters
done
這種簡單的5-10左右線解析r將解決您的許多DSL類型問題。除此之外,您可以輕鬆添加功能:
如果參數(2 ...)採用「name = value」形式,則掃描名爲「name」的參數並傳遞該參數的「value」。這可能不適用於這種特定情況,但可以適用於其他用途。
如果您的單詞命令需要參數,則嘗試將s [0]實例化爲一個類,即使有多個單詞。如果失敗,請回到上面的多字算法。
我有一種情況,在實例化後需要保持物體。我使用的語法:
find person:ana
,並從那時起(語法可以通過保持一個表映射全日空的人,一起試圖實例化對象檢查該表可以固定回原來的語法) ,ana是person類的一個實例(換句話說,在實例化「person」並調用方法「find」之後,我將該person對象存儲在名爲「ana」的散列中,下次他們使用命令如:
talk ana
它會搜索散列f首先,抓住存儲在那裏的對象,並在該現有對象上調用「talk」(在這一點上,它可以檢查ana是否設置了「發現」標誌,否則它可能會返回不同的消息)。通過這種方式,您可以擁有多個朋友,每個朋友都擁有自己的所有狀態信息。
這個系統有一些限制,但仍比Ruby風格的DSL靈活得多,實際上並不難實現。