【问题标题】:What's the most efficient way to evaluate an IF condition?评估 IF 条件的最有效方法是什么?
【发布时间】:2014-08-08 13:31:11
【问题描述】:

我正在做一个语言解释器,我已经到了需要评估 if 语句的地步。起初我认为这很简单,我可以让我的解释器在这样的条件下评估简单,10 == 10,但是当我试图让它评估更复杂的条件时,例如10 == 10 and 9 > 2,它搞砸了。

例如,我编写了一些 C++ 代码,可以单独评估条件的每个部分。

"Hello World" == "Hello World" or "Test" == "Test"

它目前是这样工作的,它给出了上面的实际结果和下面的预期结果。这样做的结果是:

TRUE or TRUE           <- Actual
-----------------------
TRUE or TRUE           <- Expected
-----------------------

代码如下:

#include <iostream>
#include <string>
#include <vector>    
#include "cond.h"

using namespace std;

vector <string> cond_holder;
vector <string> res;
vector <string> expects;

bool eval_cond(string cond) {
    int i;
    int i2;
    bool state = 0;
    bool final_return = false;
    string c = "";

    for (i = 0; i < cond.length();i++) {
        c += cond[i];

        if (cond[i] == '"') {
            if (state == 0)
                state = 1;
            else
                state = 0;
        } else if (cond[i] == ' ' && state == 0) {
            c = c.substr(0,c.length()-1);
            cond_holder.push_back(c);
            c = "";

        }
        if (i == cond.length()-1) {
            cout << c << endl;      
        }

    }
    for (i = 0; i < cond_holder.size();i++) {
        if (cond_holder[i+1] == "eqeq") {
            expects.push_back("TRUE");
            if (cond_holder[i] == cond_holder[i+2]) {
                res.push_back("TRUE");
            } else {
                res.push_back("FALSE");
            }
            i+=3;
        }
        if (cond_holder[i] == "and") {
            res.push_back("and");
            expects.push_back("and");
        } else if (cond_holder[i] == "or") {
            res.push_back("or");
            expects.push_back("or");
        }
    }

    for (i = 0; i < res.size();i++) {
        cout << res[i] << " ";
    }
    cout << endl << "-----------------------" << endl;

    for (i = 0; i < expects.size();i++) {
        cout << expects[i] << " ";
    }
    cout << endl << "-----------------------" << endl;

    return final_return;
}

int main() {
    cout << eval_cond("string:\"Hello World\" eqeq string:\"Hello World\" or string:\"H\" eqeq string:\"H\" ") << endl;
    return 0;
}

不过,老实说,我只是在编写代码的过程中编写了代码,所以如果有人能告诉我一个更好的方法,我将不胜感激。我什至不确定接下来如何处理这段代码。

【问题讨论】:

  • 所以你不会遇到 if 语句的问题,只需评估更复杂的表达式。
  • @Chris 是的。我想使用我在 IF 语句中获得的任何帮助来帮助我处理其他事情,比如 while 循环、for 循环等......
  • 如果你想要效率,通过 const 引用传递 cond,不要使用 substr,它会复制,而是分配/插入和查找。

标签: c++ if-statement interpreter evaluation evaluate


【解决方案1】:
Variable is an expression
Number is an expression
String is an expression
Expression == Expression is an expression
Expression AND Expression is an expression
Expression ; is a statement
IF Expression { statement } is a statement

用这样的点点滴滴构建你的语言,然后让它们一起崩溃。 Flex 和 Yacc 的旧 unix 手册很好地介绍了该主题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-02
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多