/media/sda-magnetic/david/david2/david2/Dokumente/informatik/linux/twitter-python-2022-07-31/arithcompilertwitter2.c


#include <stdio.h>
#include <stdlib.h>
#include <time.h>

/*
 * numexpr  ::= term numexpr2 
 * numexpr2 ::= + term numexpr2 | e
 * term     ::= factor term2
 * term2    ::= * factor term2 | e
 * factor   ::= id | const | (expr)
 */

int numexpr (void);
int numexpr2 (void);
int term (void);
int term2 (void);
int factor (void);

int numexpr (void) {
    int x, y;
    x = term ();
    y = numexpr2 ();

        if (y != -1) {
            printf (" + ");
            return x+y;
        }
        else 
            return x;

}

int numexpr2 (void) {
    int x, y;
    x = term ();
    y = numexpr2 ();
    if ((rand () % 2) == 0) {
        if (y != -1) {
            printf (" + ");
            return x+y;
        }
        else 
            return x;
    }
    else {
        return -1;
    }
}

int term (void) {
        int x, y;
        x = factor ();
        y = term ();
        if (y != -1) {
            printf (" * ");
            return x * y;
        }
        else
            return x;
}

int term2 (void) {
    int x, y;
    if ((rand () % 2) == 0) {
        x = factor ();
        y = term ();
        if (y != -1) {
            printf (" * ");
            return x * y;
        }
        else
            return x;
    }
    else { 
        return -1;
    }
}

int factor (void) {
    int y;
    int x = rand () % 11;
    if ((x >= 0) && (x <= 9)) {
        printf ("%i", x);
        return x;
    }
    else if (x == 10) {
        printf ("(");
        y = numexpr ();
        printf (")");
        return y;
    }
}


int main (void) {
    srand( time( NULL ) );
    printf ("= %i\n", numexpr ());
return 0;
}