0

我正在为家庭作业编写一些类似 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

这很可悲,我知道,但这是我的作业:'(

那么有人知道评估这样的事情的技巧吗?

4

5 回答 5

2

好的,顺便说一句,很好的家庭作业问题。

这真的取决于你想要它有多重。您可以创建一个完整的表达式解析器(这很有趣但也很耗时)。

为此,您需要描述完整的语法并编写前端(看看 lex 和 yacc 或 flexx 和 bison.

但是当我看到您的问题时,您可以将自己限制在三个子案例中:

  • 一个简单的值
  • 查找(可能到另一个表)
  • 输入是查找的函数

我认为一点 OO 设计可以帮助你。

我不确定您是否必须处理实时刷新和循环依赖检查。否则它们也可能很棘手。

于 2009-01-25T11:10:43.863 回答
2

对于解析,我会看递归下降解析。然后有一个将所有可能的函数名称映射到函数指针的表:

struct FunctionTableEntry {
    string name;
    double (*f)(double);
};
于 2009-01-25T12:15:24.403 回答
1

你应该写一个解析器。解析器应采用表达式,即每一行,并应识别命令并构造解析树。这是第一阶段。在第二阶段,您可以通过将数据替换为命令的每个元素来评估树。

于 2009-01-25T11:10:49.683 回答
1

以前的响应者已经击中了它:您需要解析单元格内容,并解释它们

StackOverflow 已经有一大堆关于构建编译器和解释器的问题,您可以在其中找到指向资源的指针。他们之中有一些是:

等等。

旁白:我从来没有精力把它们联系在一起,甚至没有尝试建立一个全面的清单。

于 2009-01-25T15:40:10.940 回答
0

我猜你不能使用 yacc/lex (或类似的),所以你必须“手动”解析:
迭代字符串并将其分成几个部分。什么部分取决于您的语法(句法)。这样您就可以找到函数名称和参数。其难度取决于语法的复杂性。

也许您应该阅读一些有关词法分析的内容。

于 2009-01-25T11:08:25.100 回答