[英]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.