50行代碼能做什么?教你用50行python代碼制作一個(gè)計(jì)算器
前言
在本篇文章中,將向大家演示咋樣像一個(gè)通用計(jì)算器一樣解析并計(jì)算一個(gè)四則運(yùn)算表達(dá)式。我們結(jié)束的時(shí)候,我們將得到一個(gè)可以處理諸如 1+2*-(-3+2)/5.6+3樣式的表達(dá)式的計(jì)算器了。當(dāng)然,你也可以將它拓展的更為強(qiáng)大。
語(yǔ)法
對(duì)于那些不懂的如何解析和正式語(yǔ)法工作的人而言,這里有一個(gè)快速的概覽:正式語(yǔ)法是用來解析文本的一些不同層面的規(guī)則。每一個(gè)規(guī)則都描述了相對(duì)應(yīng)的那部分輸入的文本是如何組成的。
這里是一個(gè)用來展示如何解析1+2+3+4的例子:
或者用 EBNF:
解析器每次都會(huì)尋找add+number或者number+number,找到一個(gè)之后就會(huì)將其轉(zhuǎn)換成add。基本上而言,每一個(gè)解析器的目標(biāo)都在于盡可能的找到最高層次的表達(dá)式抽象。
以下是解析器的每個(gè)步驟:
number + number + number + number
第一次轉(zhuǎn)換將所有的Number變成“number”規(guī)則
[number + number] + number + number
解析器找到了它的第一個(gè)匹配模式!
[add + number] + number
在轉(zhuǎn)換成一個(gè)模式之后,它開始尋找下一個(gè)
[add + number]
add
這些有次序的符號(hào)變成了一個(gè)層次上的兩個(gè)簡(jiǎn)單規(guī)則: number+number和add+number。這樣,只需要告訴計(jì)算機(jī)如果解決這兩個(gè)問題,它就能解析整個(gè)表達(dá)式。事實(shí)上,無論多長(zhǎng)的加法序列,它都能解決! 這就是形式文法的力量。
運(yùn)算符優(yōu)先級(jí)
算數(shù)表達(dá)式并不僅僅是符號(hào)的線性增長(zhǎng),運(yùn)算符創(chuàng)造了一個(gè)隱式的層次結(jié)構(gòu),這非常適合用形式文法來表示:
這相當(dāng)于:
我們可以通過嵌套規(guī)則表示此語(yǔ)法中的結(jié)構(gòu):
讓我們?cè)谀X海中模擬一下使用這個(gè)神奇的解析器來分析1+2*3*4的過程:
number + number * number * number
number + [number * number] * number
解析器不知道number+number的結(jié)果,所以這是它(解析器)的另一個(gè)選擇
number + [mul * number]
number + mul
現(xiàn)在我們遇到了一點(diǎn)困難! 解析器不知道如何處理number+mul。我們可以區(qū)分這種情況,但是如果我們繼續(xù)探索下去,就會(huì)發(fā)現(xiàn)有很多不同的沒有考慮到得可能,比如mul+number, add+number, add+add, 等等。
那么我們應(yīng)該怎么做呢?
幸運(yùn)的是,我們可以做一點(diǎn)小“把戲”:我們可以認(rèn)為一個(gè)number本身是一個(gè)乘積,并且一個(gè)乘積本身是一個(gè)和!
這種思路一開始看起來有點(diǎn)古怪,不過它的確是有意義的:
但是如果 mul能夠變成 add, 且 number能夠變成 mul , 有些行的內(nèi)容就變得多余了。丟棄它們,我們就得到了:
讓我們來使用這種新的語(yǔ)法來模擬運(yùn)行一下1+2*3*4:
number + number * number * number
現(xiàn)在沒有一個(gè)規(guī)則是對(duì)應(yīng)number*number的了,但是解析器可以“變得有創(chuàng)造性”
number + [number] * number * number
number + [mul * number] * number
number + [mul * number]
[number] + mul
[mul] + mul
[add + mul]
add
成功了。!
如果你覺得這個(gè)很奇妙,那么嘗試著去用另一種算數(shù)表達(dá)式來模擬運(yùn)行一下,然后看看表達(dá)式是如何用正確的方式來一步步解決問題的;蛘叩戎喿x下一節(jié)中的內(nèi)容,看看計(jì)算機(jī)是如何一步步運(yùn)行出來的!

發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
最新活動(dòng)更多
-
3月27日立即報(bào)名>> 【工程師系列】汽車電子技術(shù)在線大會(huì)
-
4月30日立即下載>> 【村田汽車】汽車E/E架構(gòu)革新中,新智能座艙挑戰(zhàn)的解決方案
-
5月15-17日立即預(yù)約>> 【線下巡回】2025年STM32峰會(huì)
-
即日-5.15立即報(bào)名>>> 【在線會(huì)議】安森美Hyperlux™ ID系列引領(lǐng)iToF技術(shù)革新
-
5月15日立即下載>> 【白皮書】精確和高效地表征3000V/20A功率器件應(yīng)用指南
-
5月16日立即參評(píng) >> 【評(píng)選啟動(dòng)】維科杯·OFweek 2025(第十屆)人工智能行業(yè)年度評(píng)選
推薦專題
- 1 UALink規(guī)范發(fā)布:挑戰(zhàn)英偉達(dá)AI統(tǒng)治的開始
- 2 北電數(shù)智主辦酒仙橋論壇,探索AI產(chǎn)業(yè)發(fā)展新路徑
- 3 降薪、加班、裁員三重暴擊,“AI四小龍”已折戟兩家
- 4 “AI寒武紀(jì)”爆發(fā)至今,五類新物種登上歷史舞臺(tái)
- 5 國(guó)產(chǎn)智駕迎戰(zhàn)特斯拉FSD,AI含量差幾何?
- 6 光計(jì)算迎來商業(yè)化突破,但落地仍需時(shí)間
- 7 東陽(yáng)光:2024年扭虧、一季度凈利大增,液冷疊加具身智能打開成長(zhǎng)空間
- 8 地平線自動(dòng)駕駛方案解讀
- 9 封殺AI“照騙”,“淘寶們”終于不忍了?
- 10 優(yōu)必選:營(yíng)收大增主靠小件,虧損繼續(xù)又逢關(guān)稅,能否乘機(jī)器人東風(fēng)翻身?