C ++中的表达式评估

时间:2009-01-25 10:47:40

标签: c++ regex pattern-matching expression-evaluation

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

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

所以有人知道评估此类内容的技巧吗?

5 个答案:

答案 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