2012-09-25 21 views
0

所以我試圖製作一個Python應用程序,就像一個集合論計算器(即兩個集合,交集,補集等的聯合)。我希望有一個文本字段,在執行時,它將像Python表達式一樣進行評估,並將大括號全部轉換爲集合。計算新組時,結果將顯示在屏幕上。但是,我想確保用戶不會輸入任何可能會影響整個應用程序(或更糟;系統)的Python命令,無論是否有意或無意。他應該只能輸入以下內容;如何限制表達式eval()或exec()可以運行?

  • Set操作(集,差,基數等;我公司將提供按鈕的數學符號,並使用正則表達式,使其正確的引擎蓋下)
  • 集(這反過來,也只能容納以下元素;其他集合,元組,整數,實數,字母字符和字符串)。

爲了給你一個想法,這是輸入和輸出應該是什麼樣子(這個程序將是一個GUI,我只是使用終端樣式方便):

>>> {1, 2, a} - {a} 
{1, 2} 

任何提示嗎?或者我應該只是實現一種迷你語言,然後將其轉化爲Python命令?

+1

讓用戶輸入任意代碼是嚴重危險的... HTTP://www.codinghorror.com/blog/2008/10/programming- is-hard-lets-go-shopping.html – jozefg

+0

如果你*「信任」*用戶(例如,它在他們的機器上運行,*他們的憑據*下)..然後讓他們按照自己的意願去做。買家要當心和所有。但是,如果您希望僅編寫/使用/僅允許特定的DSL,那麼請務必僅處理特定的DSL語法解析和所有(但使用工具來幫助:)。 – 2012-09-25 03:47:51

+0

在這種情況下什麼是DSL? – JesseTG

回答

0

我會用你可以翻譯成python命令的迷你語言。

如果要用{}表示法表示集合,則只需確保括號內包含的每個非數字值都像字符串一樣對待(以避免安全風險)。嵌套括號將被實例化爲凍結集,因爲集不可以被嵌套並且不能被嵌套。

解析的集之間的操作數可能應該不限於:

s <= t test whether every element in s is in t 
s >= t test whether every element in t is in s 
s | t new set with elements from both s and t 
s & t new set with elements common to s and t 
s - t new set with elements in s but not in t 
s^t new set with elements in either s or t but not both 
+0

我可能會使用數學符號(藉助屏幕上的鍵盤)。但是由於我沒有任何數據結構背景,我現在可能會堅持下去。謝謝! – JesseTG

1

Compile表達式首先,然後walk the resultant AST驗證它只包含您明確想要允許的操作。 然後evaluate它。

+0

你是什麼意思?我還沒有參加過數據結構課,所以請耐心等待。 – JesseTG

+0

最全面的方法+1。 –

+0

@JesseTG:「T」是AST是「樹」。你需要在分支上下跳動以解析樹。 –