我正在写一些类似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、穆尔、Div、Pow、Log(10)、Ln、Mod
这很可悲,我知道,但这是我的家庭作业:
有没有人知道一个技巧来评估这样的东西?
5条答案
按热度按时间2g32fytz1#
好的,顺便说一句,这是一个很好的家庭作业问题。
这真的取决于你想要它有多重。您可以创建一个完整的表达式解析器(这很有趣,但也很耗时)。
为了做到这一点,您需要描述完整的语法并编写一个前端(看看lex和yacc或flexx和野牛。
但正如我所看到的你的问题,你可以限制自己到三个子情况:
我认为一个小小的OO设计可以帮助你。
我不确定您是否必须处理真实的时间刷新和循环依赖检查。否则他们也会很狡猾。
o8x7eapl2#
对于解析,我会看看递归下降解析。然后有一个表,将所有可能的函数名Map到函数指针:
icnyk63a3#
你应该写一个解析器。解析器应该接受表达式,也就是每一行,并且应该识别命令并构造解析树。这是第一阶段。在第二阶段,您可以通过将数据替换为命令的每个元素来评估树。
7gs2gvoe4#
前几位回答者击中了它的头部:您需要解析单元格内容,并解释它们。
StackOverflow已经有一大堆关于构建编译器和interperter的问题,你可以在那里找到指向资源的指针。其中一些是:
等
jyztefdp5#
我猜你不能使用yacc/lex(或类似的),所以你必须“手动”解析:
迭代字符串并将其划分为各个部分。什么是部分取决于你的语法(句法)。这样你就可以找到函数名和参数。这一点的难度取决于你的语法的复杂性。
也许你应该读一读lexical analysis。