2014-09-04 70 views
1

我是新來的Python,我正在努力編寫一個計算器程序。我一直在嘗試做以下事情,但沒有成功,所以請指點我正確的方向:Python - 計算器程序和字符串

我想輸入一個方程作爲用戶,例如: f(t)= 2x^5 + 8

程序應該識別字符串的不同部分,並在這種情況下創建一個變量f(t)並將它分配給2x^5 + 8。

不過,如果我輸入的方程式隨後等號,例如 2X^5 + 8 =

程序將不是隻輸出答案。

我不是問如何編寫求解方程的數學邏輯,只是如何讓程序識別字符串的不同部分並據此作出決定。

對不起,我沒有任何代碼顯示爲一個嘗試,因爲我不知道如何去做這件事,我正在尋找一些幫助開始。

謝謝。

+0

This help:http://stackoverflow.com/questions/312443/how-do-you-split-a-list-into-evenly-sized-chunks-in-python?如果可以的話,嘗試發佈編碼嘗試。 – MikeiLL 2014-09-04 02:17:40

+1

「做一個變量f(t)」是什麼意思?這是否意味着你想稍後能夠寫'f(t)'並且回到那個等式?或者寫'f(2)'並用'2'代替't'得到那個等式? (當然,等式中沒有「t」......)或者是什麼?另外,「2x^5 + 8 ='應該是」答案「是什麼?這不是一個等式。你想讓它在右邊假設'0'並解決這個問題嗎?或者有些不同? – abarnert 2014-09-04 02:26:55

+1

無論如何,答案是你需要編寫一個解析器。如果你的語法實際上是Python的一個完美的子集,你可以使用Python的解析器,通過調用'ast.parse'然後執行生成的AST。否則,您可能希望使用像'pyparsing'這樣的解析器庫(它有一些很好的例子),或者編寫一個語法並將其提供給解析器生成器工具。 – abarnert 2014-09-04 02:28:24

回答

0

對於一些情況:您所描述的問題通常被稱爲parsing,它可能會變得相當複雜,具體取決於grammar語法是對語言的描述;在你的情況下,語言是你的計算器的所有有效公式的集合。

即使在開始編碼之前,第一個建議的步驟是正式確定語法。這主要是爲了您自己的利益,因爲它會使編程更容易。一個完善的方法是使用EBNF來描述語法,並且Python中存在像PLY這樣的工具,您可以使用這些工具爲這些語言生成解析器。

試試你的計算器語法的簡化版本:

digit := "0" | "1"     # our numbers are in binary 
number := digit | number digit  # these numbers are all nonnegative 
variable := "x" | "y"    # we recognize two variable names 
operator := "+" | "-"    # we could have more operators 
expression := number | variable | "(" expression operator expression ")" 
definition := variable "=" expression 
evaluation := expression "=" 

注意,沒有與此語法多個問題。例如:

  1. 什麼是空格?
  2. 那麼負數呢?
  3. 你如何處理輸入如x = x(這是一個有效的definition)?

前兩個可能是語法本身的問題,而最後一個可能需要在稍後階段處理(語言可能是context sensitive?)。

但無論如何,考慮到這樣的語法,像PLY這樣的工具可以爲您生成一個解析器,但讓您自己去處理任何其他邏輯(如x = x)。然而,首先,我建議你嘗試自己實現它。一個想法是使用遞歸編寫一個所謂的Top Down Parser