0
我目前正在嘗試構建一個非常簡單的編譯器。我已經創建了一個函數,使用分流碼算法將中綴表示法中的數學公式轉換爲RPN,但是我遇到了問題。我沒有在我的轉換函數中包含錯誤檢查,所以我想知道是否有一種簡單的方法來檢查中綴表示法中的函數是否使用正確的中綴表示法語法。這將使我能夠保留當前的轉換函數,而不會通過錯誤檢查來掩蓋它。驗證數學公式C++
我目前正在嘗試構建一個非常簡單的編譯器。我已經創建了一個函數,使用分流碼算法將中綴表示法中的數學公式轉換爲RPN,但是我遇到了問題。我沒有在我的轉換函數中包含錯誤檢查,所以我想知道是否有一種簡單的方法來檢查中綴表示法中的函數是否使用正確的中綴表示法語法。這將使我能夠保留當前的轉換函數,而不會通過錯誤檢查來掩蓋它。驗證數學公式C++
如果你的表情只包含括號,值(常數和/或標識符),和前綴,後綴和中綴運營商,那麼有兩種錯誤情況,你需要檢查:
括號必須比賽。使用分流碼算法很難不注意到這一點,因爲在算法中存在一個問題,即在輸入中遇到右括號時,彈出的圓括號從堆棧中彈出。如果過度使用堆棧或者在輸入結束時沒有彈出整個堆棧,則括號不會平衡。
令牌必須符合以下簡單正則表達式:
PRE* VAL POST* (INFIX PRE* VAL POST*)*
其中
PRE
是前綴操作員或(POST
是一個後綴操作者或)VAL
是一個值:常數或一個標識符這實際上降低到一兩狀態的狀態機:(狀態0)可以被稱爲「預期值」的初始狀態和另一種狀態(狀態1)可以稱爲「期望操作員」。只有狀態1正在接受,並且轉換如下:
State 0:
PRE → State 0
VAL → State 1
State 1:
POST → State 1
INFIX → State 0
所有其他轉換都發生錯誤。
爲了正確處理一元減號(以及其他可能是前綴或中綴的運算符),通常需要實現此狀態機,並且無論如何,它都非常易於集成到輸入處理中。
不幸的是,這是一個相當廣泛的問題:實現這種事情有不可知數量的不同方法,所以你所要求的是非常開放的。幫助我們解決特定的問題(和一些代碼!)。 – defube
編譯器本身是用C++還是其他語言編寫的? – RockPaperLizard
你能給我們語法嗎?你只是接受一個字符串:「13 42 100 + *」還是什麼? –