/media/sda-magnetic/david/compilerbau/pattern-matching/1th-episode/reg7.c


/*

+ ersetzt |
* ersetzt *

abcde
a+bcd
a*bcd
a(hajsd)h

zusammengefasst_und_folge a(b)c oder (b)a oder a(b)
zusammengefasst ()
folge abc 
wiederholungsoperator a* oder ()*
oder operator a|b oder a|() oder ()|() oder ()|a


zusammengefasst_und_folge   ::= zusammengfasst | zusammengfasst folge | folge
zusammengefasst             ::= ( zusammengefasst_und_folge )
folge                       ::= buchstabe zusammengefasst_und_folge


oder_operator               ::= wiederholungsoperator + wiederholungsoperator | wiederholungsoperator
wiederholungsoperator       ::= zusammengefasst_und_folge* | zusammengefasst_und_folge
zusammengefasst_und_folge   ::= zusammengfasst | zusammengfasst folge | folge
zusammengefasst             ::= ( oder_operator )
folge                       ::= buchstabe oder_operator

oder_operator               ^= or_operator 
wiederholungs_operator      ^= repeat_operator
zusammengefasst_und_folge   ^= summarized_and_followed
zusammengefasst             ^= summerized
folge                       ^= followed

a summerized
b followed 
ab summerized followed 
*/
#include <stdio.h>
#include <stdlib.h>

char expr [] = "a(bcd)def";
int i = 0;

char gettoken () {
    return expr [i++];
}
void tokenback () {
    i--;
}
int or_operator ();
int repeat_operator ();
int summarized_and_followed ();
int summarized ();
int followed ();

int or_operator () {
    repeat_operator ();
    if (gettoken () == '+')
        repeat_operator ();
    else
        tokenback ();
}
int repeat_operator () {
    summarized_and_followed ();
    if (gettoken () == '*');
    else
        tokenback ();
}
int summarized_and_followed () {
    int ch = gettoken ();
    if (ch == ')');
    else {
        if (ch == '(') {
            tokenback ();
            summarized ();
            followed ();
        }
        else 
            followed ();
    }
}
int summarized () {
    int ch = gettoken ();
    if (ch == '(') {
        summarized_and_followed ();
        ch = gettoken ();
        if (ch != ')') {
            fprintf (stderr, "Fehler ) vergessen ***%c***", ch);
            exit (1);
        }
    }
}
int followed () {
    int ch = gettoken ();
    if ((ch >= 'a') && (ch <= 'z')) {
        printf ("%c\n", ch);
        summarized_and_followed ();
    }

    
}


int main (void) {
    or_operator ();
}