/*
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);
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 ztmp, int xshift) {
printf ("\\node [zbox, xshift=%iem] (z%i) {\\verb\"", xshift, z);
registr ();
printf (" <- ");
operand ();
if ((rand () % RAND_EXPR_OPERATOR_OPERAND_FOLLOW) == 0) {
operator ();
operand ();
}
printf ("\"};\n");
return z+1;
}
int cond (int z, int ztmp, int xshift) {
printf ("\\node [ebox, xshift=%iem] (z%i) {\\verb\" ", xshift, z);
operand ();
cmp ();
operand ();
printf ("\"};\n");
return z+1;
}
int as (int z, int ztmp, int xshift) {
int r;
if ((r = (rand () % 8)) < 2) {
z = ztmp = cond (z, ztmp, xshift);
z = as (z, ztmp, -50);
z = as (z, ztmp, +50);
}
else if ((r >= 2) && (r <= 5)) {
z = expr (z, ztmp, xshift);
as (z, ztmp, 0);
}
return z;
}
int main (void) {
time_t t;
int j;
srand (t = time(NULL));
as (0, 0, 0);
return 0;
}