我正在为家庭作业编写一些类似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
我知道,这很可悲,但这是我的作业:'(
所以有人知道评估此类内容的技巧吗?
答案 0 :(得分:2)
好的,顺便说一下好的家庭作业问题。
这实际上取决于你想要的重量。您可以创建一个完整的表达式解析器(这很有趣但也很耗时)。
为了做到这一点,你需要描述完整的语法并写一个前端(看看lex和yacc或flexx和bison。
但是当我看到你的问题时,你可以将自己限制在三个子句中:
我认为一点OO设计可以帮助你在这里。
我不确定您是否必须处理实时刷新和循环依赖性检查。否则他们也可能很棘手。
答案 1 :(得分:2)
对于解析,我会看一下Recursive descent parsing。然后有一个表将所有可能的函数名称映射到函数指针:
struct FunctionTableEntry {
string name;
double (*f)(double);
};
答案 2 :(得分:1)
你应该写一个解析器。解析器应该采用表达式,即每一行,并且应该识别命令并构造解析树。这是第一阶段。在第二阶段,您可以通过将数据替换为命令的每个元素来评估树。
答案 3 :(得分:1)
以前的响应者已经发现了它:你需要解析单元格内容并解释它们。
StackOverflow已经有很多关于构建编译器和间隔器的问题,您可以在其中找到指向资源的指针。其中一些是:
等等。
除此之外:我从来没有精力把它们连在一起,甚至试图建立一个全面的清单。
答案 4 :(得分:0)
我猜你不能使用yacc / lex(或类似的),所以你必须“手动”解析:
迭代字符串并将其分成部分。什么是一部分取决于你的语法(语法)。这样你就可以找到函数名和参数。这种困难取决于语法的复杂性。
也许您应该阅读lexical analysis。