Re: Pattern Matching

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

#define X   1024
#define END -1
#define CONTROLSTATE '#'

char statechar [X];
int state1 [X];
int state2 [X];
int x;

int initstates () {
    int l;

    for (l = 0;  l < X;  l++) {
        statechar [l] = ' ';
    }

}

int jx = 0;

char expr [] = "[[[[,],],[,]],[,]]";
//char expr [] = "abcd";
int i = 0;

char gettoken () {
    return expr [i++];
}
void tokenback () {
    i--;
}


int stream ();
int followed ();
int compound ();
int or_operator (int);
int repeat_operator ();
void print_padding (int);

int x = 0;

/*
Wenn es keine atomare Einheit ist
hat es
1.) einen Anfang
2.) eine Mitte
3.) ein Ende
Eine atomare Einheit hat
1.) einen Anfang = eine Mitte = ein Ende

- Die Mitte des "ausseren ist das ende des ersten inneren
  und der Anfang des zweiten inneren
- die Mitte des inneren zeigt auf das Ende des inneren
- die Mitte des "ausseren zeigt auf das Ende des "ausseren

- Es gibt die Einteilung
1.) Anfang
2.) Mitte
3.) Ende

1.) Es gibt die erste H"alfte
2.) Es gibt die zweite H"alfte

1.) Das ende der ersten H"alfte zeigt auf das Ende des Ganzen
2.) Das ende der zweiten H"alfte zeigt auf das Ende des Ganzen

- Die Frage ist - was ist unsere Einheit ...
    ... wir sagen Atomare Einheit

- Die Einheit ist der Zustand

- Regel: Wir bilden
- F"ur
1.) Anfang
2.) Mitte
3.) Ende
einen einzelnen Zustand
Atomare Einheiten bekommen einen Zustand

Die Atomare Einheit stellt die Mitte des "ausseren dar

Anfang: a: (Anfang)
Mitte: m (Mitte)
Ende: e (Ende)
Atomare Einheit: d

So jetzt m"ussen wir anfangen ein Tupel zu bilden

Es ist nicht einfach Anfang und Ende. Sondern jedes Tupel hat bestimmte Daten.

Der Anfang kombiniert sich mit dem n"achsten. Zum Beispiel
Die Mitte kombiniert sich mit dem Ende

(d,e) Atomare Einheit -> Ende

Generelle Regel, wir geben immer das Ende zur"uck

Eine Atomare Einheit, kann ein Zeichen sein. Dann ist das der Zustand
Eine Atomare Einheit kann eine Zeichenkette sein, dann ist das Ende der Atomaren Einheit, das Ende der Zeichenkette.

Dieses Ende - Regel, geben wir immer zur"uck

Atomare Einheit

(d,e)
(a, n"achstes Zeichen) Der Anfang liesse sich in mehrere Anfange zusammensetzen
Hier beginnt der Fehler im Denken, wir sehen einen Anfang, an einer Stelle, wo in kurzen Intervall viele Dinge anfangen, die jeweils einen Anfang haben
(e,e)

Es gibt
(e,e)
(e,m)
a1, a2, a3, a4
(a1, a2) (an, an+1), (an, d)
(d1, d2)
*/

void print_padding (int l) {
  while (l > 0) {printf ("  "); l--;}
}

int or_operator (int l) {
    int x1;
    int x2;

    if (gettoken (l+1) == '[') {

        print_padding (l);
        printf ("a: %in", x);  // Der Zustand f"ur den Anfang
        x++;

        x1 = or_operator (l+1);

        print_padding (l);
        printf ("m: %in", x);
        x++;

        if (gettoken () != ',') {
            fprintf (stderr, "Komma vergessen");
            exit (1);
        }

        x2 = or_operator (l+1);

        print_padding (l);
        printf ("e: %in", x);
        x++;

        if (gettoken () != ']') {
            fprintf (stderr, "Klammer vergessen ]");
            exit (1);
        }
    }
    else {
      print_padding (l);
      printf ("d: %in", x++);
      tokenback ();
      return x;
    }
}

int or_operator2 (int l) {
    int x1;
    int x2;

    if (gettoken (l+1) == '[') {

        print_padding (l);
        printf ("a: %in", x);  // Der Zustand f"ur den Anfang
        x++;

        x1 = or_operator2 (l+1);

        print_padding (l);
        printf ("m: %in", x);
        x++;

        if (gettoken () != ',') {
            fprintf (stderr, "Komma vergessen");
            exit (1);
        }

        x2 = or_operator2 (l+1);

        print_padding (l);
        printf ("e: %in", x);
        x++;

        if (gettoken () != ']') {
            fprintf (stderr, "Klammer vergessen ]");
            exit (1);
        }
    }
    else {
      print_padding (l);
      printf ("d: %in", x++);
      tokenback ();
      return x;
    }
}
/* Jetzt stehen wir vor dem Problem, dass es d1 und d2 gibt. Aber wir k"onnen die Atomaren einheiten nicht unterscheiden
Das ist das Problem vom B"aumen, wir haben links und rechts, indem Falle, True und False
*/

#define     TRUE  1
#define     FALSE 0
#define     LEFT  FALSE
#define     RIGHT TRUE

int or_operator3 (int successor, int l) {
    int x1;
    int x2;

    if (gettoken (l+1) == '[') {

        print_padding (l);
        printf ("a[%i]: %in", l, x);  // Der Zustand f"ur den Anfang
        x++;

        x1 = or_operator3 (LEFT, l+1);

        print_padding (l);
        printf ("m[%i]: %in", l, x);
        x++;

        if (gettoken () != ',') {
            fprintf (stderr, "Komma vergessen");
            exit (1);
        }

        x2 = or_operator3 (RIGHT, l+1);

        print_padding (l);
        printf ("e[%i]: %in", l, x);
        x++;

        if (gettoken () != ']') {
            fprintf (stderr, "Klammer vergessen ]");
            exit (1);
        }
    }
    else {
      print_padding (l);
      printf ("d[%i:%i]: %in", successor, l, x++);
      tokenback ();
      return x;
    }
}

/*
int automat (int x, int xtext) {
    int flag = 0;

    if (strlen (text) <= xtext)
      return 1;
    if (statechar [x] == CONTROLSTATE) {
      if (state1 [x] == state2 [x])
        flag = automat (state1 [x], xtext);
      else
        flag = automat (state1 [x], xtext) || automat (state2 [x], xtext);
    }
    else if ((statechar [x] >= 'a') \&amp;\&amp; (statechar [x] <= 'z'))  {
      if (statechar [x] == text [xtext])
        flag = 1;
      if (state1 [x] == state2 [x])
        flag \&amp;= automat (state1 [x], xtext+1);
      else
        flag \&amp;= (automat (state1 [x], xtext+1) || automat (state2 [x], xtext+1));
    }
    return flag;
}*/



int main (void) {
    or_operator (0);
    printf ("successn");
    x = 0;
    i = 0;
    or_operator2 (0);
    printf ("successn");
    x = 0;
    i = 0;
    or_operator3 (LEFT, 0);
    printf ("successn");

 }

a: 0
  a: 1
    a: 2
      a: 3
        d: 4
      m: 5
        d: 6
      e: 7
    m: 8
      d: 9
    e: 10
  m: 11
    a: 12
      d: 13
    m: 14
      d: 15
    e: 16
  e: 17
m: 18
  a: 19
    d: 20
  m: 21
    d: 22
  e: 23
e: 24
success
a: 0
  a: 1
    a: 2
      a: 3
        d: 4
      m: 5
        d: 6
      e: 7
    m: 8
      d: 9
    e: 10
  m: 11
    a: 12
      d: 13
    m: 14
      d: 15
    e: 16
  e: 17
m: 18
  a: 19
    d: 20
  m: 21
    d: 22
  e: 23
e: 24
success
a[0]: 0
  a[1]: 1
    a[2]: 2
      a[3]: 3
        d[0:4]: 4
      m[3]: 5
        d[1:4]: 6
      e[3]: 7
    m[2]: 8
      d[1:3]: 9
    e[2]: 10
  m[1]: 11
    a[2]: 12
      d[0:3]: 13
    m[2]: 14
      d[1:3]: 15
    e[2]: 16
  e[1]: 17
m[0]: 18
  a[1]: 19
    d[0:2]: 20
  m[1]: 21
    d[1:2]: 22
  e[1]: 23
e[0]: 24
success