#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int is_id(char *);
int is_plus(char *);
int is_mult(char *);
int is_minus(char *);
int is_div(char *);
int is_pow(char *);
int is_diff(char *);
int is_open_round_bracked(char *);
int is_closed_round_bracked(char *);
int is_num(char *);
int is_id(char *str) {return ((str[0] >= 'a') && (str[0] <= 'z') && (str[1] == 0));}
int is_plus(char *str) {return ((str[0] == '+') && (str[1] == 0));}
int is_minus(char *str) {return ((str[0] == '-') && (str[1] == 0));}
int is_mult(char *str) {return ((str[0] == '*') && (str[1] == 0));}
int is_div(char *str) {return ((str[0] == '/') && (str[1] == 0));}
int is_pow(char *str) {return ((str[0] == '^') && (str[1] == 0));}
int is_diff(char *str) {return ((str[0] == '\'') && (str[1] == 0));}
int is_open_round_bracked(char *str) {return ((str[0] == '(') && (str[1] == 0));}
int is_closed_round_bracked(char *str) {return ((str[0] == ')') && (str[1] == 0));}
int is_num(char *str) {
int flag = 1;
int i;
for(i = 0; str[i] != 0; i++)
if(!((str[i] >= '0') && (str[i] <= '9')))
flag = 0;
return flag;
}
char buf[1024*1024];
char tmp_str[256];
int buf_i = 0;
int buf_len;
char stack[128][128];
int stack_ptr = 0;
void push(char *str) {
strcpy(stack[stack_ptr], str);
stack_ptr++;
return;
}
void pop(char *str) {
stack_ptr--;
strcpy(str, stack[stack_ptr]);
return;
}
int expr_next_var_name_i = 1;
int lex_get_token_from_stream(char *str) {
int i;
int ch;
if(buf_i == buf_len)
return 0;
ch = buf[buf_i];
i = 0;
if ((((ch >= 'a') && (ch <= 'z')) || ((ch >= 'A') && (ch <= 'Z')) || (ch == '_')) && ((buf_i + i ) < buf_len)) {
str[i] = ch;
i++;
ch = buf[buf_i + i];
while ((((ch >= 'a') && (ch <= 'z')) || ((ch >= 'A') && (ch <= 'Z')) || (ch == '_')) && ((buf_i + i) < buf_len)) {
str[i] = ch;
i++;
ch = buf[buf_i + i];
}
str[i] = 0;
}
else if ((ch >= '0') && (ch <= '9') && ((buf_i + i ) < buf_len)) {
str[i] = ch;
i++;
ch = buf[buf_i + i];
while ((ch >= '0') && (ch <= '9') && ((buf_i + i ) < buf_len)) {
str[i] = ch;
i++;
ch = buf[buf_i + i];
}
str[i] = 0;
}
else if(ch == '=') {
str[i] = ch;
i++;
ch = buf[buf_i + i];
if(ch == '=') {
str[i] = ch;
i++;
}
str[i] = 0;
}
else if(ch == '!') {
str[i] = ch;
i++;
ch = buf[buf_i + i];
if(ch == '=') {
str[i] = ch;
i++;
}
str[i] = 0;
}
else if(ch == '<') {
str[i] = ch;
i++;
ch = buf[buf_i + i];
if(ch == '=') {
str[i] = ch;
i++;
}
str[i] = 0;
}
else if(ch == '>') {
str[i] = ch;
i++;
ch = buf[buf_i + i];
if(ch == '=') {
str[i] = ch;
i++;
}
str[i] = 0;
}
else if(ch == ':') {
str[i] = ch;
i++;
ch = buf[buf_i + i];
if(ch == '=') {
str[i] = ch;
i++;
}
str[i] = 0;
}
else if(ch == '.') {
str[i] = ch;
i++;
ch = buf[buf_i + 1];
if(ch == '.') {
str[i] = ch;
i++;
}
str[i] = 0;
}
else if(ch == '^') {
str[i] = ch;
i++;
ch = buf[buf_i + 1];
if(ch == '^') {
str[i] = ch;
i++;
}
str[i] = 0;
}
else {
str[i] = ch;
i++;
str[i] = 0;
}
return i;
}
int lex_get_token_from_stream_ws(char *str) {
int i;
i = lex_get_token_from_stream(str);
while (((str[0] == '\n') || (str[0] == '\t') || (str[0] == '\r') || (str[0] == ' ')) && ((buf_i + i) < buf_len)) {
buf_i += i;
i = lex_get_token_from_stream(str);
if(i == 0)
return 0;
}
return i;
}
int epsilon(void) {
return 1;
}
int po(void);
int pow2(void);
int numexpr(void);
int numexpr2(void);
int term(void);
int term2(void);
int factor (void);
int id (void);
int id (void) {
char str[256];
int buf_i_start;
int retval = 1;
int buf_j;
buf_i_start = buf_i;
buf_j = lex_get_token_from_stream_ws(str);
if (is_id(str)) {
buf_i += buf_j;
retval = 1;
}
else {
buf_i = buf_i_start;
retval = 0;
}
return retval;
}
int po(void) {
char str[256];
int buf_i_start;
int retval = 1;
int buf_j;
buf_i_start = buf_i;
retval = numexpr();
if (retval) {
retval = pow2 ();
if(retval);
else {
buf_i = buf_i_start;
retval = 0;
}
}
else {
buf_i = buf_i_start;
retval = 0;
}
return (retval);
}
int pow2(void) {
char str[256];
int buf_i_start;
int retval = 1;
int buf_j;
char tmp_str[128];
char tmp_str2[128];
char tmp_str3[128];
char tmp_str4[128];
buf_i_start = buf_i;
buf_j = lex_get_token_from_stream_ws(str);
printf("%s\n", str);
if (is_pow(str)) {
buf_i += buf_j;
retval = numexpr ();
pop(tmp_str2);
pop(tmp_str3);
sprintf(tmp_str4, "%s ^ %s", tmp_str2, tmp_str3);
push(tmp_str4);
if(retval) {
retval = pow2 ();
if(retval);
else {
buf_i = buf_i_start;
retval = 0;
}
}
else {
buf_i = buf_i_start;
retval = 0;
}
}
else if (retval = epsilon());
return retval;
}
int numexpr(void) {
char str[256];
int buf_i_start;
int retval = 1;
int buf_j;
buf_i_start = buf_i;
retval = term();
if (retval) {
retval = numexpr2 ();
if(retval);
else {
buf_i = buf_i_start;
retval = 0;
}
}
else {
buf_i = buf_i_start;
retval = 0;
}
return (retval);
}
int numexpr2(void) {
char str[256];
int buf_i_start;
int retval = 1;
int buf_j;
char tmp_str[128];
char tmp_str2[128];
char tmp_str3[128];
char tmp_str4[128];
buf_i_start = buf_i;
buf_j = lex_get_token_from_stream_ws(str);
if (is_plus(str)) {
buf_i += buf_j;
retval = term ();
pop(tmp_str2);
pop(tmp_str3);
sprintf(tmp_str4, "(%s + %s)", tmp_str2, tmp_str3);
printf("%s\n", tmp_str4);
push(tmp_str4);
if(retval) {
retval = numexpr2 ();
if(retval);
else {
buf_i = buf_i_start;
retval = 0;
}
}
else {
buf_i = buf_i_start;
retval = 0;
}
}
else if (retval = epsilon());
return retval;
}
int term(void) {
char str[256];
int buf_i_start;
int retval = 1;
int buf_j;
buf_i_start = buf_i;
retval = factor();
if (retval) {
retval = term2 ();
if(retval);
else {
buf_i = buf_i_start;
retval = 0;
}
}
else {
buf_i = buf_i_start;
retval = 0;
}
return (retval);
}
int term2(void) {
char str[256];
int buf_i_start;
int retval = 1;
int buf_j;
char tmp_str[128];
char tmp_str2[128];
char tmp_str3[128];
char tmp_str4[128];
buf_i_start = buf_i;
buf_j = lex_get_token_from_stream_ws(str);
if (is_mult(str)) {
buf_i += buf_j;
retval = factor ();
pop(tmp_str2);
pop(tmp_str3);
sprintf(tmp_str4, "(%s * %s)", tmp_str2, tmp_str3);
printf("%s\n", tmp_str4);
push(tmp_str4);
if(retval) {
retval = term2 ();
if(retval);
else {
buf_i = buf_i_start;
retval = 0;
}
}
else {
buf_i = buf_i_start;
retval = 0;
}
}
else if (retval = epsilon());
return (retval);
}
int factor (void) {
char str[256];
int buf_i_start;
int retval = 1;
int buf_j;
char tmp_str[128];
char tmp_str2[128];
char tmp_str3[128];
char tmp_str4[128];
buf_i_start = buf_i;
buf_j = lex_get_token_from_stream_ws(str);
if (is_id(str)) {
push(str);
buf_i += buf_j;
buf_j = lex_get_token_from_stream_ws(str);
if (is_open_round_bracked(str)) {
buf_i += buf_j;
if (retval = po()) {
buf_j = lex_get_token_from_stream_ws(str);
if (is_closed_round_bracked(str)) {
buf_i += buf_j;
retval = 1;
}
else {
buf_i = buf_i_start;
retval = 0;
}
}
else {
buf_i = buf_i_start;
retval = 0;
}
pop(tmp_str);
pop(tmp_str2);
strcat(tmp_str2, tmp_str);
push(tmp_str2);
}
else {
retval = 1;
push(str);
}
}
else if (is_open_round_bracked(str)) {
buf_i += buf_j;
if (retval = po()) {
buf_j = lex_get_token_from_stream_ws(str);
if (is_closed_round_bracked(str)) {
buf_i += buf_j;
retval = 1;
}
else {
buf_i = buf_i_start;
retval = 0;
}
}
else {
buf_i = buf_i_start;
retval = 0;
}
}
else if (is_num(str)) {
buf_i += buf_j;
retval = 1;
push(str);
}
else {
buf_i = buf_i_start;
retval = 0;
}
return retval;
}
void get_buf(FILE *fp) {
int i;
i = 0;
while(!feof(fp)) {
buf[i] = fgetc(fp);
i++;
}
buf_len = i - 1;
return;
}
int main(int argc, char *argv[]) {
FILE *fp;
char str[256];
if((fp = fopen(argv[1], "r")) == NULL) {
perror("Can't open file!");
return -1;
}
get_buf(fp);
if(numexpr())
fprintf(stderr, "\n\n\nDer Code enthaelt keine Fehler - NO ERROR!!!\n");
else
fprintf(stderr, "\n\n\nDer Code enthaelt einen Fehler - ERROR!!!\n");
fclose(fp);
return 0;
}