簡體   English   中英

C ++中的表達評估

[英]Expression Evaluation in C++

我正在寫一些類似於excel的C ++控制台應用程序用於作業。 我的應用應該能夠接受其單元格的公式,例如,它應該評估如下內容:

Sum(tablename\fieldname[recordnumber], fieldname[recordnumber], ...)

tablename\fieldname[recordnumber] points to a cell in another table, 
fieldname[recordnumber] points to a cell in current table

要么

Sin(fieldname[recordnumber])

要么

anotherfieldname[recordnumber]

要么

"10" // (simply a number)

這樣的事情。 函數是Sum,Ave,Sin,Cos,Tan,Cot,Mul,Div,Pow,Log(10),Ln,Mod

我知道這很可悲,但這是我的作業:'(

那么,有人知道評估這樣的技巧嗎?

好的,順便提一下不錯的作業問題。

這實際上取決於您希望它有多沉重。 您可以創建一個完整的表達式解析器(這很有趣,但也很耗時)。

為此,您需要描述完整的語法並編寫一個前端(查看lex和yacc或flexx和bison。

但是,正如我看到的問題一樣,您可以將自己限制為三個子案例:

  • 一個簡單的值
  • 查找(可能到另一個表)
  • 輸入為查詢的函數

我認為一些面向對象的設計可以幫助您。

我不確定是否需要處理實時刷新和循環依賴項檢查。 否則它們也可能很棘手。

對於解析,我將看一下遞歸下降解析。 然后有一個表將所有可能的函數名稱映射到函數指針:

struct FunctionTableEntry {
    string name;
    double (*f)(double);
};

您應該編寫一個解析器。 解析器應采用表達式,即每一行,並應標識命令並構造解析樹。 這是第一階段。 在第二階段,您可以通過將數據替換為命令的每個元素來評估樹。

以前的響應者已經把它放在了首位: 您需要解析單元格內容並對其進行解釋

關於構建編譯器和互操作器,StackOverflow已經有很多問題,您可以在其中找到指向資源的指針。 他們之中有一些是:

等等。

撇開:我再也沒有精力將它們聯系在一起,甚至試圖建立一個全面的清單。

我猜你不能使用yacc / lex(或類似的東西),所以你必須“手動”解析:
遍歷字符串並將其分成多個部分。 組成部分取決於您的語法(語法)。 這樣,您可以找到函數名稱和參數。 難度取決於語法的復雜程度。

也許您應該閱讀一些有關詞法分析的知識

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM