程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 簡單的表達式求值

簡單的表達式求值

編輯:關於C++

一直很想做個比Windows自帶的高級一點的計算器,能將整個表達式輸入,然後求值。這個程序要求讀者具備編譯原理的一些知識。舉個實例來說明程序處理過程。假設要求值的表達式為 :

-25*(56+15)# (其中#號作為表達式結束標志)。

首先對表達式進行詞法分析,允許出現的字符為:

{0 ,1, 2 ,3 ,4 ,5 ,6, 7 ,8, 9 . ,+ ,-, *, / ,( ,),#}

分析的結果產生兩種類型的單詞:操作符和操作數。

操作符包括:

{+, - ,* ,/ ,( ,)}

操作數包括:

int 和 double 類型。

上面表達式產生的單詞序列為:

{-25,*,(,56,+,15,)}。

這些單詞的類型也需要保存。

詞法分析正確後將對產生的單詞序列進行語法分析。

定義E為表達式,N為常數(視為終結符)。表達式的產生式可表示如下:

E ' N
E ' (E)
E ' E+E
E ' E-E
E ' E*E
E ' E/E
消除左遞歸後的產生式(E_為新產生的符號):

E->NE_
E->(E)E_
E_->+EE_
E_->-EE_
E_->*EE_
E_->/EE_
E_->NULL (空串)

可以根據這個產生式構造遞歸的語法分析器。具體細節就不敘述了,可以閱讀源代碼。

語法分析正確後就可以求值了,求值時用到一個操作數堆棧和操作符堆棧,以及一個算符優先表(存儲了運算符之間的優先關系),具體細節可以閱讀源碼。

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved