【问题标题】:Expression Evaluation in C++C++ 中的表达式求值
【发布时间】:2009-01-25 10:47:39
【问题描述】:

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

这很可悲,我知道,但这是我的功课:'(

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

【问题讨论】:

  • 你可能认为它很可悲,它是家庭作业,它是为了让你学习。你应该尝试根据你已经学过的概念设计一个解决方案。拥有专家的解决方案将使您通过作业,但您从问题中学到的东西将受到限制。
  • 或者至少足够聪明,别说这是家庭作业 :-)

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


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 耶,递归下降解析!我认为在 C++ 中我宁愿使用继承和多态而不是函数指针。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      之前的响应者对此一针见血:您需要解析单元格内容并解释它们

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

      等等。

      除此之外:我从来没有精力将它们联系在一起,甚至没有尝试建立一个完整的列表。

      【讨论】:

      • ++ 我亲手写过一些。
      【解决方案5】:

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

      也许你应该阅读一下lexical analysis

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-10
        相关资源
        最近更新 更多