碼生成器,把數學表達式翻譯成後綴表達式,也就是逆波蘭表示法。比如a加b乘c」,要輸出abc乘加」。你會怎麼做?」
這是經典題,不算難。
彭遠征幾乎是下意識地回答:「用棧。遇到操作數就輸出,遇到運算符就和棧頂比優先級。」
「好。」陸懷民點點頭,追問了一句,「那如果表達式中出現了括號呢?比如a加b乘以c減d。」
「左括號直接壓棧。遇到右括號,就把棧裡的運算符依次彈出,直到匹配的左括號。」
彭遠徵答得很快,這些都是基礎的東西,對他來說自然不是什麼問題。
陸懷民點點頭,繼續問:「彭師兄,你剛才說的是中綴表達式轉逆波蘭。現在我們換個角度想。如果不用棧,你能不能換一種方式實現同樣的功能?」
彭遠征愣了一下。
不用棧?
他腦子裡飛快地轉了一圈。
棧是這個問題標準的、最直觀的解。
不用棧,還有什麼辦法?這他倒確實沒想過。
「我————沒有想過這個問題。我一直用棧。」彭遠征知道他一時半會兒肯定想不到答案,索性如實回答。
「棧沒問題。「陸懷民說,「棧確實是最直觀、內存開銷最小的方法。但如果我們麵對的不是簡單的數學表達式呢?如果我們要處理的是一種更複雜的加工描述語言呢?」
他頓了頓,繼續說道:「你想想,用棧來寫的話,每加一種新的運算符,你就要改一次優先級表;
每加一種新的語法結構,你就要在棧的彈出邏輯裡加一堆分支判斷。到最後,整個程序會變成一團亂麻,沒人敢改,也沒人能看懂。那時候你怎麼辦?」
彭遠征的眉頭擰了起來。他隱約感覺到了陸懷民想說什麼,但又抓不住那個點。
畢竟這個時代的代碼複雜程度和後世是不可同日而語的。
很多後世的算法在這個時代極具有前瞻性。
「有一種方法,叫遞歸下降。」陸懷民說著,在麵前攤開的筆記本上刷刷寫了幾行偽代碼,把筆記本轉過來,推到彭遠征麵前:「不用棧,用函數的調用棧來代替數據棧。比如a加b乘c」,你可以定義一個解析函數,遇到加號的時候,先把左操作數輸出,然後遞歸處理右操作數,最後再輸出加號本身。」
彭遠征低頭看去。
那幾行偽代碼寫得清清爽爽,遞歸的調用順序標註得明明白白。
他一行一行往下看,心裡那層窗戶紙嘩一下就破了。
「這————這不就是編譯原理教材裡講的語法樹後序遍歷嗎?怎麼我一直沒想到用遞歸來————」
他差點想說「用遞歸來做表達式轉換」,但話到嘴邊,他自己先愣住了。
因為他突然意識到,他不是「沒想到」。而是他這些年來,從來隻在「棧「這一個框架裡打轉。
因為棧是這個問題公認標準解法,書上這麼寫,同行這麼做,他在無線電廠寫的每一個工控程序也都是這麼寫的。
所以他從來沒有想過,這件事可以不這麼做。
可眼前這個比他還小十幾歲的年輕人,似乎壓根就不覺得棧是唯一的路。
最新小說章節盡在o o p . t w
彭遠征忽然想起自己在無線電廠那十年,那本油印編譯原理教材時,書裡有一頁專門講了「遞歸下降法」。
但那一頁印得太模糊了,油墨糊成一團,隻能勉強辨認出幾個標題。當時他沒在意,翻過去了。
現在想來,他可能錯過了一扇門。
「遞歸下降解析法,是這幾年國外在嵌入式編譯器裡應用得比較多的一種方法。」陸懷民說:「它比棧更靈活,能處理更複雜的語法結構,而且代碼結構清晰,調試方便。如果我們課題組要做後處理編譯器,這個方法可能用得上。」
彭遠征點點頭,心裡翻湧著說不清的滋味。
「陸————」他抬起頭,一時竟不知該怎麼稱呼,「陸師弟,我能問一個問題嗎?」
」。講請「
」?則規法語計設麼怎備準你,令指些這義定宏、轉跳、環循的裡碼代控數,說如比一一義語的雜複更理處要果如,上礎基的降下歸遞在「
」?呢得覺兄師彭「:問反,笑了笑民懷陸
。思沉了入陷征遠彭
。請邀種一是而,較考是不的到受感他,題問個這的問民懷陸
。考思來起一他請邀
」————構結子示表間中個一成包打令指碼代G有所的麵裡體環循把降下歸遞,候時的L令指環循到讀器析解。表字鍵關個一義定預先,段階析分法詞在以可「:句字著酌斟,兒會一了考思他」————得覺我「
」————動用不全完輯邏析解的麵前,步一那開展後最改要需隻,言方碼代G了換機具工標目果如,來一樣這。碼代G的機具工標目成開展一統示表間中把,後最「:說續繼,順很路思個這得覺然忽,頓了頓他
。下一了驚度晰清的法想個這被都己自他,完說
G的統係控數種一意任配適以可端後,變不端前,來一樣這。碼代標目成譯翻示表間中把端後;示表間中成生,法語析解端前。端後和端前成拆程過譯編把「:頭點點民懷陸」。想思的譯編層分是就實其這。對「
。言方碼代
。雜複些有然忽裡心,民懷陸著看征遠彭
。的譯編懂是己自為以直一,書年十了啃頭埋裡當行個這譯編在他
。西東的沿前雜複麼什是不也西東些這,示表間中、譯編層分、降下歸遞如比,西東些那的到提民懷陸才剛可
。裡目項程工的在在實實個一在用以可,來起串樣這以可識知的散零些這,他訴告人有沒來從但
。拳的正真場一過打沒來從卻,功本基年十了練人的拳學像好就
。的真是夫功的人這,道知就他手伸一但,淺歷資他比,輕年他比。前麵他在站手對的練對,在現
。害厲實確