Каков наиболее эффективный способ оценки условия ЕСЛИ?

Я делаю интерпретатор языка, и я дошел до того, что мне нужно оценить операторы 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;
}

Честно говоря, я просто составлял код по мере продвижения, поэтому я был бы признателен, если бы кто-нибудь подсказал мне лучший способ сделать это. Я даже не уверен, что делать с этим кодом дальше.


person Francis    schedule 08.08.2014    source источник
comment
Таким образом, у вас нет проблем с операторами if, просто с оценкой более сложных выражений.   -  person chris    schedule 08.08.2014
comment
@ Крис, да. Я хотел бы использовать любую помощь, которую я получаю с операторами IF, чтобы помочь мне с другими вещами, такими как циклы while, циклы for и т. д...   -  person Francis    schedule 08.08.2014
comment
Если вам нужна эффективность, передайте cond по ссылке const и не используйте substr, которая делает копии, а вместо этого назначайте/вставляйте и находите.   -  person Neil Kirk    schedule 08.08.2014


Ответы (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

Постройте свой язык из подобных кусочков, и пусть все это рухнет вместе. Старое руководство Unix для Flex и Yacc было хорошим введением в тему.

person Andy Newman    schedule 08.08.2014