bool calcMul(double &result, int &curLex, char lexemeString []) { bool isNegative = false; if (curLex == add || curLex == take) { isNegative = curLex == take; nextLexeme(curLex, lexemeString); } switch (curLex) { case number: { result = toNum(lexemeString); nextLexeme(curLex, lexemeString); break; } case open:{ nextLexeme(curLex, lexemeString); if (!calcExp(result, curLex, lexemeString)) return false; if (curLex != close) return false; nextLexeme(curLex, lexemeString); break; } } result *= isNegative ? -1 : 1; return true; }
int main() { int curLex = start; char lexemeString[10] = { '/0' }; double result = 0.0; nextLexeme(curLex, lexemeString); if (calcExp(result, curLex, lexemeString)) printf("%0.3f\n", result); else printf("wrong expression\n"); return 0; }
bool calcTerm(double &result, int &curLex, char lexemeString []) { if (!calcMul(result, curLex, lexemeString)) return false; while (curLex == multiplication || curLex == division) { int operation = curLex; double next = 0.0; nextLexeme(curLex, lexemeString); if (!calcMul(next, curLex, lexemeString)) return false; switch (operation) { case multiplication: { result *= next; break; } case division:{ result /= next; break; } } } return true; }
bool calcExp(double &result, int &curLex, char lexemeString []) { if (!calcTerm(result, curLex, lexemeString)) return false; while (curLex == add || curLex == take) { int operation = curLex; nextLexeme(curLex, lexemeString); double next = 0.0; if (!calcTerm(next, curLex, lexemeString)) return false; switch (operation) { case add: { result += next; break; } case take: { result -= next; break; } } } return curLex == finish || curLex == close; }
int test_nextLexeme(char *s, ...){ int length; int type; int testType; va_list args; va_start(args, s); printf("[\n"); while(!nextLexeme(s, &length, &type)){ testType = va_arg(args, int); printf("\t{type:%d, typeName:\"%s\", lexeme:\"", type, LEXEMETYPE_STRINGS[type]); puts_escaped(s, s+length); printf("\"},\n"); s += length; if(testType != type){ printf("types don't match!\n"); exit(1); } } printf("]\n"); return 0; }