簡介
在這篇文章中,我將向大家演示怎樣向一個通用計算器一樣解析并計算一個四則運算表達式。當我們結束的時候,我們將得到一個可以處理諸如 1+2*-(-3+2)/5.6+3樣式的表達式的計算器了。當然,你也可以將它拓展的更為強大。
我本意是想提供一個簡單有趣的課程來講解 語法分析 和 正規語法(編譯原理內容)。同時,介紹一下PlyPlus,這是一個我斷斷續續改進了好幾年的語法解析 接口。作為這個課程的附加產物,我們最后會得到完全可替代eval()的一個安全的四則運算器。
如果你想在自家的電腦上試試本文中給的例子的話,你應該先安裝 PlyPlus ,使用命令pip install plyplus 。(譯者注:pip是一個包管理系統,用來安裝用python寫的軟件包,具體使用方法大家可以百度之或是google之,就不贅述了。)
本篇文章需要對python的繼承使用有所了解。
語法
對于那些不懂的如何解析和正式語法工作的人而言,這里有一個快速的概覽:正式語法是用來解析文本的一些不同層面的規則。每一個規則都描述了相對應的那部分輸入的文本是如何組成的。
這里是一個用來展示如何解析1+2+3+4的例子:
Rule #1 - add IS MADE OF add + number OR number + number
或者用 EBNF:
add: add'+'number | number'+'number ;
解析器每次都會尋找add+number或者number+number,找到一個之后就會將其轉換成add。基本上而言,每一個解析器的目標都在于盡可能的找到最高層次的表達式抽象。
以下是解析器的每個步驟:
number + number + number + number
第一次轉換將所有的Number變成“number”規則
[number + number] + number + number
解析器找到了它的第一個匹配模式!
[add + number] + number
在轉換成一個模式之后,它開始尋找下一個
[add + number] add
這些有次序的符號變成了一個層次上的兩個簡單規則: number+number和add+number。這樣,只需要告訴計算機如果解決這兩個問題,它就能解析整個表達式。事實上,無論多長的加法序列,它都能解決! 這就是形式文法的力量。
運算符優先級
算數表達式并不僅僅是符號的線性增長,運算符創造了一個隱式的層次結構,這非常適合用形式文法來表示:
1 + 2 * 3 / 4 - 5 + 6
這相當于:
1 + (2 * 3 / 4) - 5 + 6
我們可以通過嵌套規則表示此語法中的結構:
新聞熱點
疑難解答