Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*\
- Script by Louis Wilke
- 26.11.2015
- Simple math parser
- \*/
- #include <stdio.h>
- #include <stdlib.h>
- void error(int code);
- int isOperator(char character);
- int precedence(char character);
- int main ( void ) { //MAIN
- char input[255], output[255], stack[255];
- int i = 0, o = 0, s = 0, var = 0, a;
- system("clear");
- fgets(input, 255, stdin); //read the math stuff
- do {var++;} while (input[var] != '\n');
- input[var] = 0; //remove \n
- printf("SHUNTING-YARD-ALGORITHM:\n");
- while (input[i] != 0) {
- if (input[i] > 47 && input[i] < 58) { //is int
- printf("%c is int => on output\n", input[i]);
- output[o] = input[i]; //put on output
- o++;
- } else if (input[i] == '(') { //'(' to stack
- printf("( => on stack\n");
- stack[s] = input[i];
- s++;
- } else if (input[i] == ')') { //empty stack till '(' is found
- printf(") => put stack on output till '(' is found\n");
- while (stack[s - 1] != '(') {
- if (s == 0) {error(1);} //stack is empty / no '(' found
- output[o] = stack[s - 1]; //put stack on output
- o++;
- s--;
- }
- s--; //remove '(' from stack
- } else if (isOperator(input[i])) { //operator
- while (s != 0 && isOperator(stack[s-1]) && precedence(input[i]) <= precedence(stack[s-1])) {
- output[o] = stack[s-1]; //put stack on output
- o++;
- s--;
- }
- stack[s] = input[i]; //put token on stack
- s++;
- printf("%c is operator => on stack, stack has %d element(s):", input[i], s);
- for(var=0; var < s; var++) {printf("%c", stack[var]);}
- printf("\n");
- } else { //unknown token
- if (input[i] != ' ') { //ignore spaces
- printf("%c", input[i]);
- error(4);
- }
- }
- i++;
- }
- printf("put whole stack on output (%d element(s)):", s);
- for(var=0; var < s; var++) {printf("%c", stack[var]);}
- while (s != 0) { //put stack on output
- if (stack[s-1] == '(') {error(3);}
- output[o] = stack[s-1];
- o++;
- s--;
- }
- output[o] = 0; //end string
- printf("\n%s\n\nREVERSE POLISH NOTATION:\n", output);
- i = 0;
- o = 0;
- s = 0;
- while (output[o] != 0) {
- if (output[o] > 47 && output[o] < 58) { //is int
- printf("%c is int => on stack\n", output[o]);
- stack[s] = output[o] - 48; //put as int on int_stack
- s++;
- } else { //is operator
- printf("%c is operator => pop 2 stack items with %c\n", output[o], output[o]);
- switch (output[o]) {
- case '+': stack[s - 2] = stack[s - 2] + stack[s - 1]; break;
- case '-': stack[s - 2] = stack[s - 2] - stack[s - 1]; break;
- case '*': stack[s - 2] = stack[s - 2] * stack[s - 1]; break;
- case '/': stack[s - 2] = stack[s - 2] / stack[s - 1]; break;
- }
- s--; //popped 2 items into 1
- }
- o++; //next char
- }
- printf("%s = %d\n", input, stack[0]);
- return 0;
- } //END
- int isOperator(char character) { //checks a character for opartors
- if (character > 41 && character < 48 && character != ',' && character != '.') {
- return 1;
- } else {
- return 0;
- }
- } //END
- int precedence(char character) { //returns the precedence (+ - is 0, * / is 1)
- if (character == '+' || character == '-') {
- return 0;
- } else if (character == '*' || character == '/') {
- return 1;
- } else {
- error(2);
- }
- } //END
- void error(int code) { //exit with error message
- switch (code) {
- case 1: printf("Fehlende oeffnende Klammer\n"); break;
- case 2: printf("Ungueltiges Zeichen\n"); break;
- case 3: printf("Zu viele oeffnende Klammern\n"); break;
- case 4: printf(" unbekanntes Zeichen\n"); break;
- }
- exit(code);
- } //END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement