c expression Evaluator

前端 未结 7 711
梦如初夏
梦如初夏 2020-12-01 09:50

Okay lets say I have a string such as this in a text file:

((( var1 AND var2 AND var3) OR var4) AND ((var5 OR var6) AND var7))

after parsin

7条回答
  •  一生所求
    2020-12-01 10:44

    I has similar program around that implement recursive-decent parser so I brush it up and here it is.

     #include 
     #include 

    int doOR(int pOprd1, int pOprd2) { if (pOprd1 == -1) return pOprd2; return pOprd1 || pOprd2; } int doAND(int pOprd1, int pOprd2) { if (pOprd1 == -1) return pOprd2; return pOprd1 && pOprd2; } int doProcess(char pOpert, int pOprd1, int pOprd2) { if (pOpert == '0') return pOprd2; if (pOpert == 'O') return doOR (pOprd1, pOprd2); if (pOpert == 'A') return doAND(pOprd1, pOprd2); puts("Unknown Operator!!!"); exit(-1); } int* doParse(char pStr, int pStart) { char C; int i = pStart; int Value = -1; char Operator = '0'; for(; (C = pStr[i]) != 0; i++) { if (C == '0') { Value = doProcess(Operator, Value, 0); continue; } if (C == '1') { Value = doProcess(Operator, Value, 1); continue; } if (C == ' ') continue; if (C == ')') { int aReturn; aReturn = malloc(2*sizeof aReturn); aReturn[0] = Value; aReturn[1] = i + 1; return aReturn; } if (C == '(') { int * aResult = doParse(pStr, i + 1); Value = doProcess(Operator, Value, aResult[0]); i = aResult[1]; if (pStr[i] == 0) break; continue; } if ((C == 'A') && ((pStr[i + 1] == 'N') && (pStr[i + 2] == 'D'))) { if ((Operator == '0') || (Operator == 'A')) { Operator = 'A'; i += 2; continue; } else { puts("Mix Operators are not allowed (AND)!!!"); exit(-1); } } if ((C == 'O') && (pStr[i + 1] == 'R')) { if ((Operator == '0') || (Operator == 'O')) { Operator = 'O'; i += 1; continue; } else { puts("Mix Operators are not allowed (OR)!!!"); exit(-1); } } printf("Unknown character: '%c (\"%s\"[%d])'!!!", C, pStr, i); exit(-1); } int* aReturn; aReturn = malloc(2*sizeof aReturn); aReturn[0] = Value; aReturn[1] = i; return aReturn; }

    And this is a test code:

    int main(void) {
        char* aExpr   = "1";
        int*  aResult = doParse(aExpr, 0);
        printf("%s = %d\n", aExpr, ((int*)aResult)[0]);
        free(aResult);
        aExpr   = "0";
        aResult = doParse(aExpr, 0);
        printf("%s = %d\n", aExpr, ((int*)aResult)[0]);
        free(aResult);
        aExpr   = "1 AND 0";
        aResult = doParse(aExpr, 0);
        printf("%s = %d\n", aExpr, ((int*)aResult)[0]);
        free(aResult);
        aExpr   = "1 AND 1";
        aResult = doParse(aExpr, 0);
        printf("%s = %d\n", aExpr, ((int*)aResult)[0]);
        free(aResult);
        aExpr   = "0 OR 0 OR 0";
        aResult = doParse(aExpr, 0);
        printf("%s = %d\n", aExpr, ((int*)aResult)[0]);
        free(aResult);
        aExpr   = "1 OR 0 OR 0";
        aResult = doParse(aExpr, 0);
        printf("%s = %d\n", aExpr, ((int*)aResult)[0]);
        free(aResult);
        aExpr   = "1 OR 1 OR 0";
        aResult = doParse(aExpr, 0);
        printf("%s = %d\n", aExpr, ((int*)aResult)[0]);
        free(aResult);
        aExpr   = "(1 OR 0)";
        aResult = doParse(aExpr, 0);
        printf("%s = %d\n", aExpr, ((int*)aResult)[0]);
        free(aResult);
        aExpr   = "(0 OR 0)";
        aResult = doParse(aExpr, 0);
        printf("%s = %d\n", aExpr, ((int*)aResult)[0]);
        free(aResult);
        aExpr   = "((( 1 AND 0 AND 0) OR 1) AND ((0 OR 1) AND 1))";
        aResult = doParse(aExpr, 0);
        printf("%s = %d\n", aExpr, ((int*)aResult)[0]);
        free(aResult);
        puts("DONE!!!");
        return EXIT_SUCCESS;
    }
    

    This is fun :-D.

提交回复
热议问题