你可以解析A
來構造指令樹,然後從樹葉開始執行它們(因爲我假設你想先執行最內層括號的內容)。對於這個解析任務,你可以使用正則表達式,或其他任何你想要的。關於我的頭頂,我認爲你可以先查找圓括號和運算符符號來找出樹結構,然後用實際的基本指令和與操作符的每個交點填充每個葉子。
數據結構存儲A
可以由實現接口IOperand
的對象(稱爲它們Expression
)組成;每個Expression
應該有三個領域:
- 場
Operator
這是enum Operations {Union, Intersection, SetDiff}
一個實例,或只是一個字符串,這取決於你喜歡。
- 兩個字段
Operand1
和Operand2
,它們可以是「Ah」(定義一組卡片)或另一個Expression
。因此,應將其聲明爲IOperand
的實例。
你的班級持有一套卡,如「啊」,也應該實現這個IOperand
。界面IOperand
本身實際上不需要做任何事情。
對於每一個給定的指令匹配的操作,您可以使用一個簡單的開關,或者的string
(或enum
)到delegate IOperand SetOp(IOperand, IOperand);
一個Dictionary
,然後填充您Dictionary
用(匿名)功能(將包含的說明B
)。
在Dictionary
情況下,您只需將能夠做到instructionList[thisExpression.Operation](thisExpression);
(這大概可以做到更優雅一點,以避免引用thisExpression
兩次)和字符串輸入適當的C#轉換將被執行。概念
證明
我已經做了基本的實現和控制檯應用程序演示使用這裏:https://bitbucket.org/Superbest/lexer
如果你在整個鍛鍊你的理智完好(電腦會進展成功使用你作爲代理解析和操作庫,所以祝你好運),那麼最後一步應該要求你評估一個等於C
的表達式,然後打印你剛纔輸入的內容。 (第一次運行時,您可能想要遵守程序指令,我懷疑破解代碼和獲取大量例外非常容易,如果您想要考慮發生了什麼情況,您會非常困惑自己。輸入)
如果您正在爲運行這些代碼,嘗試回答以下序列(=輸入):
n, y, 2, n, n, n, y, 2, n, n, y, n, y, 2, n, n, n, n, alpha, beta, gamma
你的輸出將是:
gamma
你應該能夠簡單地更新標記爲過時的方法的主體並進行工作ng程序。
如果您希望添加更多二進制操作,請參閱Simplification.Simplification()
正文中的TODO。通過查看我已經完成的三項操作,適當的語法將會很明顯;實際上,代碼僅支持二進制操作。如果您的方法使用字符串,則可以使用SimplifiedOperand.Symbol
字段。
Downvoter,照顧評論? –
您能否提供A符合的語法規範以及它是如何翻譯爲B的? – Superbest
我寫了一個名爲TokenIcer的詞法分析器,它可能正是您的項目所需要的。檢查[項目在這裏](http://www.codeproject.com/Articles/220042/Easily-Create-Your-Own-Parser)。它將以您希望的任何.NET語言爲您創建代碼!您只需將規則定義爲RegEx表達式,並自動爲整個詞法分析器創建源代碼。另外,我寫了一個使用TokenIcer的數學解析器。有了這個,你可以看到如何解析表達式。看看它[這裏](http://www.codeproject.com/Articles/274093/Math-Parser-NET) – Icemanind