/media/sda-magnetic/david/Dok-15-2023-11-27/informatik/AUTOMAT-GENERATOR-2024-01-28/asmparser7.c


/*
Grammatik

Sporadische Sammlung
- Zuweisung
- Addition
if 
- Vergleiche
    - <=, >=, ==, !=, <, >
- Subtraktion
- Shift
    << >>
- Null setzen
    
Operationen
    - Mathematische: 
        + (Addition)
        - (Subtraktion) 
    - Verschieben
        >> Rechtsshift
        << Linksshift
    - 0 setzen 
Vergleiche
    - <=, >=, ==, !=, <, >
Zuweisung
    <-
    
Zeichensatz: Variablen, Register, Operatoren und Konstante Werte

Operand ::= <Register> | <Const>
CMP ::= <= | >= | == | != | < | >
MathOperator ::= + | - | << | >>
BitBooleanOperator ::= '&&' | '||' | '!'
Operator ::= <MathOperator> | <BitBooleanOperator>
Expr ::= <Register> <- <Operand> | <Operand> <Operator> <Operand> | 0
Condition ::= IF <Register> <CMP> <Operand> THEN <Program> FI

Programm ::= <Expr> | <Condition> <Program>
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

#define     MAX_STATES                              1024
#define     MAX_EXPR_CONST_VAL                      128
#define     MAX_EXPR_REG_VAL                        4
#define     FIRST_REG_VAL                           'a'
#define     MAX_EXPR_OPERATOR_VAL                   6
#define     MAX_EXPR_CMP_OPERATOR_VAL               5
#define     RAND_OPERAND_CONST_REGISTER             2
#define     RAND_EXPR_OPERATOR_OPERAND_FOLLOW       2
#define     RAND_COND_TRUE_FALSE_DESICION           2
#define     RAND_PROGRAM_COND_EXPR_DESICION         4
#define     IF_ELSE_DEPTH                           3
#define     STD_PROGRAM_N                           6   
#define     STD_PROGRAM2_N                          4
#define     RAND_COND_END_OR_GO_ON                  3

FILE *fout = NULL;

int line = 0;
int nline = 1;
int maxstate = 0;

char *opstr [] = {"+", "-", "<<", ">>", "&&", "||", "!"};
char *cmpstr [] = {"<=", ">=", "==", "!=", "<", ">"};

void operator (void);
void cmp (void);
void operand (void);
int expr (int, int, int);
int condition (int, int, int);
void registr (void);
void cnst (void);
void operator (void);
void printemptyspace (int);


void registr (void) {
    printf (" %c ", (rand () % MAX_EXPR_REG_VAL) + FIRST_REG_VAL);
return;
}

void cnst (void) {
    printf (" %i ", rand () % MAX_EXPR_CONST_VAL);
return;
}

void operator (void) {
    printf (" %s ", opstr [rand () % MAX_EXPR_OPERATOR_VAL]);
return;
}

void cmp (void) {
    printf (" %s ", cmpstr [rand () % MAX_EXPR_CMP_OPERATOR_VAL]);
return;
}

void operand (void) {
    if ((rand () % RAND_OPERAND_CONST_REGISTER) == 0)
        cnst ();
    else
        registr ();
return;
}

int expr (int z, int xshift, int xdiff) {
    printf ("\\node [zbox, xshift=%i] (z%i) {\\verb\"", xshift+xdiff, z);
    registr ();
    printf (" <- ");
    operand ();
    if ((rand () % RAND_EXPR_OPERATOR_OPERAND_FOLLOW) == 0) {
        operator ();
        operand ();
    }
    printf ("\"};\n");
return z+1;
}

int cond (int z, int xshift, int xdiff) {
    printf ("\\node [ebox, xshift=%i] (z%i) {\\verb\" ", xshift+xdiff, z);
    operand ();
    cmp ();
    operand ();
    printf ("\"};\n");
    return z+1;
}

int as (int z, int xshift, int xdiff) {
    int ztmp;
    int r;
    if ((r = (rand () % 8)) < 2) {
        z = ztmp = cond (z, xshift, 0);
        z = as (z, xshift, xdiff/2);
        z = as (z, xshift, -(xdiff/2));
    }
    else if ((r >= 2) && (r <= 5)) {
        z = expr (z, xshift, xdiff);
        as (z, xshift, xdiff);
    }
return z;
}






int main (void) {
    time_t t;
    int j;
    srand (t = time(NULL));


    as (0, 50, 50);
return 0;
}