[英]Catching a missing operand or operator in stack while converting to postfix from infix
我一直在嘗試找出在從中綴轉換為后綴時如何捕捉丟失的操作數或運算符。
例如)
Tall = Y
會打印出來
Tall Y =
我考慮過要實現一個局部變量來計算運算符和操作數的數量,並將其設置為
if(Operators + 1 < Operands )
return errexitMissing Operator);
if(Operators + 1 > Operands )
return errexit(Missing Operand);
到目前為止,該代碼似乎可以正常工作,但是后來我不知道該如何處理括號。
例如)
(Tall = ) Y
該文本應該返回錯誤,因為括號后沒有操作數,而是像這樣返回它
Tall Y =
我現在不知所措,似乎無法處理括號:/
擴展方法的一種方法是編寫一個函數,該函數計算給定子表達式內的運算符和操作數的數量,其中子表達式用括號括起來。 最簡單的方法是使用遞歸下降解析器(句柄優雅嵌套)。 也就是說,在一般情況下,我不認為對運算符和操作數進行計數實際上會起作用。 您可能需要考慮更多情況。
也就是說,您需要首先驗證最里面帶括號的子表達式(深度優先遞歸),然后需要對其進行評估並將其用作封閉的子表達式的一部分,以驗證該子表達式,依此類推,直到解析完整個子表達式為止。表達。
處理括號問題的一種簡單方法是跟蹤您處理的最后一個標記是運算符還是操作數。 開放式括號(
,只能在行的開頭或運算符之后。封閉式括號)
只能在操作數之后。
如果您跟蹤最后一個標記,那么當您在(Tail = ) Y
遇到關閉括號時,您會知道存在錯誤,因為)
緊跟在運算符之后。
您可以將其擴展到一般情況,並跟蹤接下來要使用的是操作數還是運算符。 您知道,例如,不能連續有兩個操作數。 也就是說,如果中綴表達式為AB + C
,則在遇到B
時,您會知道該表達式無效。
同樣,盡管一元運算符是一個明顯的例外,但通常不會連續有多個運算符: A + - B
完全有效。
通常,中綴到后綴的轉換問題假定中綴表達式有效。 如果需要捕獲錯誤的功能,則需要添加一些語法檢查以強制執行中綴表達式的規則。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.