regex C++中的表达式求值

m4pnthwp  于 2023-10-22  发布在  其他
关注(0)|答案(5)|浏览(120)

我正在写一些类似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
这很可悲,我知道,但这是我的家庭作业:
有没有人知道一个技巧来评估这样的东西?

2g32fytz

2g32fytz1#

好的,顺便说一句,这是一个很好的家庭作业问题。
这真的取决于你想要它有多重。您可以创建一个完整的表达式解析器(这很有趣,但也很耗时)。
为了做到这一点,您需要描述完整的语法并编写一个前端(看看lex和yacc或flexx和野牛。
但正如我所看到的你的问题,你可以限制自己到三个子情况:

  • 一个简单值
  • 查找(可能指向其他表)
  • 输入为查找的函数

我认为一个小小的OO设计可以帮助你。
我不确定您是否必须处理真实的时间刷新和循环依赖检查。否则他们也会很狡猾。

o8x7eapl

o8x7eapl2#

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

struct FunctionTableEntry {
    string name;
    double (*f)(double);
};
icnyk63a

icnyk63a3#

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

7gs2gvoe

7gs2gvoe4#

前几位回答者击中了它的头部:您需要解析单元格内容,并解释它们
StackOverflow已经有一大堆关于构建编译器和interperter的问题,你可以在那里找到指向资源的指针。其中一些是:

  • 旁白:我从来没有精力把它们联系在一起,甚至试图建立一个全面的列表。
jyztefdp

jyztefdp5#

我猜你不能使用yacc/lex(或类似的),所以你必须“手动”解析:
迭代字符串并将其划分为各个部分。什么是部分取决于你的语法(句法)。这样你就可以找到函数名和参数。这一点的难度取决于你的语法的复杂性。
也许你应该读一读lexical analysis

相关问题