50行代碼能做什么?教你用50行python代碼制作一個計算器

前言

在本篇文章中,將向大家演示咋樣像一個通用計算器一樣解析并計算一個四則運算表達式。我們結(jié)束的時候,我們將得到一個可以處理諸如 1+2*-(-3+2)/5.6+3樣式的表達式的計算器了。當然,你也可以將它拓展的更為強大。

語法

對于那些不懂的如何解析和正式語法工作的人而言,這里有一個快速的概覽:正式語法是用來解析文本的一些不同層面的規(guī)則。每一個規(guī)則都描述了相對應(yīng)的那部分輸入的文本是如何組成的。

這里是一個用來展示如何解析1+2+3+4的例子:

或者用 EBNF:

解析器每次都會尋找add+number或者number+number,找到一個之后就會將其轉(zhuǎn)換成add?;旧隙?,每一個解析器的目標都在于盡可能的找到最高層次的表達式抽象。

以下是解析器的每個步驟:

number + number + number + number

第一次轉(zhuǎn)換將所有的Number變成“number”規(guī)則

[number + number] + number + number

解析器找到了它的第一個匹配模式!

[add + number] + number

在轉(zhuǎn)換成一個模式之后,它開始尋找下一個

[add + number]

add

這些有次序的符號變成了一個層次上的兩個簡單規(guī)則: number+number和add+number。這樣,只需要告訴計算機如果解決這兩個問題,它就能解析整個表達式。事實上,無論多長的加法序列,它都能解決! 這就是形式文法的力量。

運算符優(yōu)先級

算數(shù)表達式并不僅僅是符號的線性增長,運算符創(chuàng)造了一個隱式的層次結(jié)構(gòu),這非常適合用形式文法來表示:

這相當于:

我們可以通過嵌套規(guī)則表示此語法中的結(jié)構(gòu):

讓我們在腦海中模擬一下使用這個神奇的解析器來分析1+2*3*4的過程:

number + number * number * number

number + [number * number] * number

解析器不知道number+number的結(jié)果,所以這是它(解析器)的另一個選擇

number + [mul * number]

number + mul

現(xiàn)在我們遇到了一點困難! 解析器不知道如何處理number+mul。我們可以區(qū)分這種情況,但是如果我們繼續(xù)探索下去,就會發(fā)現(xiàn)有很多不同的沒有考慮到得可能,比如mul+number, add+number, add+add, 等等。

那么我們應(yīng)該怎么做呢?

幸運的是,我們可以做一點小“把戲”:我們可以認為一個number本身是一個乘積,并且一個乘積本身是一個和!

這種思路一開始看起來有點古怪,不過它的確是有意義的:

但是如果 mul能夠變成 add, 且 number能夠變成 mul , 有些行的內(nèi)容就變得多余了。丟棄它們,我們就得到了:

讓我們來使用這種新的語法來模擬運行一下1+2*3*4:

number + number * number * number

現(xiàn)在沒有一個規(guī)則是對應(yīng)number*number的了,但是解析器可以“變得有創(chuàng)造性”

number + [number] * number * number

number + [mul * number] * number

number + [mul * number]

[number] + mul

[mul] + mul

[add + mul]

add

成功了?。?!

如果你覺得這個很奇妙,那么嘗試著去用另一種算數(shù)表達式來模擬運行一下,然后看看表達式是如何用正確的方式來一步步解決問題的?;蛘叩戎喿x下一節(jié)中的內(nèi)容,看看計算機是如何一步步運行出來的!

12下一頁>

(免責聲明:本網(wǎng)站內(nèi)容主要來自原創(chuàng)、合作伙伴供稿和第三方自媒體作者投稿,凡在本網(wǎng)站出現(xiàn)的信息,均僅供參考。本網(wǎng)站將盡力確保所提供信息的準確性及可靠性,但不保證有關(guān)資料的準確性及可靠性,讀者在使用前請進一步核實,并對任何自主決定的行為負責。本網(wǎng)站對有關(guān)資料所引致的錯誤、不確或遺漏,概不負任何法律責任。
任何單位或個人認為本網(wǎng)站中的網(wǎng)頁或鏈接內(nèi)容可能涉嫌侵犯其知識產(chǎn)權(quán)或存在不實內(nèi)容時,應(yīng)及時向本網(wǎng)站提出書面權(quán)利通知或不實情況說明,并提供身份證明、權(quán)屬證明及詳細侵權(quán)或不實情況證明。本網(wǎng)站在收到上述法律文件后,將會依法盡快聯(lián)系相關(guān)文章源頭核實,溝通刪除相關(guān)內(nèi)容或斷開相關(guān)鏈接。 )

贊助商
2019-01-28
50行代碼能做什么?教你用50行python代碼制作一個計算器
前言在本篇文章中,將向大家演示咋樣像一個通用計算器一樣解析并計算一個四則運算表達式。我們結(jié)束的時候,我們將得到一個可以處理諸如 1+2*-(-3+2)/5.6+3樣式的表達式的計算器了。

長按掃碼 閱讀全文