Advertisement
Guest User

Simple math parser - Louis Wilke

a guest
Nov 27th, 2015
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.46 KB | None | 0 0
  1. /*\
  2. Script by Louis Wilke
  3. 26.11.2015
  4. Simple math parser
  5. \*/
  6.  
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9.  
  10. void error(int code);
  11. int isOperator(char character);
  12. int precedence(char character);
  13.  
  14. int main ( void ) { //MAIN
  15.     char input[255], output[255], stack[255];
  16.     int i = 0, o = 0, s = 0, var = 0, a;
  17.    
  18.     system("clear");
  19.     fgets(input, 255, stdin); //read the math stuff
  20.     do {var++;} while (input[var] != '\n');
  21.     input[var] = 0; //remove \n
  22.    
  23.     printf("SHUNTING-YARD-ALGORITHM:\n");
  24.     while (input[i] != 0) {
  25.         if (input[i] > 47 && input[i] < 58) { //is int
  26.             printf("%c is int => on output\n", input[i]);
  27.             output[o] = input[i]; //put on output
  28.             o++;
  29.         } else if (input[i] == '(') { //'(' to stack
  30.             printf("( => on stack\n");
  31.             stack[s] = input[i];
  32.             s++;
  33.         } else if (input[i] == ')') { //empty stack till '(' is found
  34.             printf(") => put stack on output till '(' is found\n");
  35.             while (stack[s - 1] != '(') {
  36.                 if (s == 0) {error(1);} //stack is empty / no '(' found
  37.                 output[o] = stack[s - 1]; //put stack on output
  38.                 o++;
  39.                 s--;
  40.             }
  41.             s--; //remove '(' from stack
  42.         } else if (isOperator(input[i])) { //operator
  43.             while (s != 0 && isOperator(stack[s-1]) && precedence(input[i]) <= precedence(stack[s-1])) {
  44.                 output[o] = stack[s-1]; //put stack on output
  45.                 o++;
  46.                 s--;
  47.             }
  48.             stack[s] = input[i]; //put token on stack
  49.             s++;
  50.             printf("%c is operator => on stack, stack has %d element(s):", input[i], s);
  51.             for(var=0; var < s; var++) {printf("%c", stack[var]);}
  52.             printf("\n");
  53.         } else { //unknown token
  54.             if (input[i] != ' ') { //ignore spaces
  55.                 printf("%c", input[i]);
  56.                 error(4);
  57.             }
  58.         }
  59.         i++;
  60.     }
  61.     printf("put whole stack on output (%d element(s)):", s);
  62.     for(var=0; var < s; var++) {printf("%c", stack[var]);}
  63.     while (s != 0) { //put stack on output
  64.         if (stack[s-1] == '(') {error(3);}
  65.         output[o] = stack[s-1];
  66.         o++;
  67.         s--;
  68.     }
  69.     output[o] = 0; //end string
  70.     printf("\n%s\n\nREVERSE POLISH NOTATION:\n", output);
  71.    
  72.     i = 0;
  73.     o = 0;
  74.     s = 0;
  75.    
  76.     while (output[o] != 0) {
  77.         if (output[o] > 47 && output[o] < 58) { //is int
  78.             printf("%c is int => on stack\n", output[o]);
  79.             stack[s] = output[o] - 48; //put as int on int_stack
  80.             s++;
  81.         } else { //is operator
  82.             printf("%c is operator => pop 2 stack items with %c\n", output[o], output[o]);
  83.             switch (output[o]) {
  84.                 case '+': stack[s - 2] = stack[s - 2] + stack[s - 1]; break;
  85.                 case '-': stack[s - 2] = stack[s - 2] - stack[s - 1]; break;
  86.                 case '*': stack[s - 2] = stack[s - 2] * stack[s - 1]; break;
  87.                 case '/': stack[s - 2] = stack[s - 2] / stack[s - 1]; break;
  88.             }
  89.             s--; //popped 2 items into 1
  90.         }
  91.         o++; //next char
  92.     }
  93.     printf("%s = %d\n", input, stack[0]);
  94.    
  95.     return 0;
  96. } //END
  97.  
  98. int isOperator(char character) { //checks a character for opartors
  99.     if (character > 41 && character < 48 && character != ',' && character != '.') {
  100.         return 1;
  101.     } else {
  102.         return 0;
  103.     }
  104. } //END
  105.  
  106. int precedence(char character) { //returns the precedence (+ - is 0, * / is 1)
  107.     if (character == '+' || character  == '-') {
  108.         return 0;
  109.     } else if (character == '*' || character  == '/') {
  110.         return 1;
  111.     } else {
  112.         error(2);
  113.     }
  114. } //END
  115.  
  116. void error(int code) { //exit with error message
  117.     switch (code) {
  118.         case 1: printf("Fehlende oeffnende Klammer\n"); break;
  119.         case 2: printf("Ungueltiges Zeichen\n"); break;
  120.         case 3: printf("Zu viele oeffnende Klammern\n"); break;
  121.         case 4: printf(" unbekanntes Zeichen\n"); break;
  122.     }
  123.     exit(code);
  124. } //END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement