/*
+ 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 ();
}