/* Recursive descent parser for regular expressions
   Sten Morten Andersen, 2003

Grammar:

input      ::= expression '.'
expression ::= term [ '|' term ]
term       ::= factor [ factor ]
factor     ::= (atom | '(' expression ')') [ '+' | '?' | '*' ]
atom       ::= 'a' | 'b' | .. | 'z' | '0' | '1' | '\' any-character 
*/
void expression(); void error();

char ch;

void  get_char() {
	do ch = getchar(); while ( ch <= ' ' );
}

void factor() {
	char c = ch;
	if ( ch >= 'a' && ch <= 'z' || ch == '0' || ch == '1' ) ch = 'L';
	switch ( ch ) {
		case 'L':
			get_char();
			break;
		case '(':
			get_char();
			expression();
			if ( ch != ')' ) error( ")" );
			get_char();
			break;
	}
	while ( ch == '+' || ch == '?' || ch == '*' ) get_char();
}

void term() {
	factor();
	while ( ch >= 'a' && ch <= 'z' || ch == '(' || ch == '0' || ch == '1' ) {;
		factor();
	}
}

void expression() {
	term();
	while ( ch == '|' ) {
		get_char();
		term();
	}	
}

void error(char* s) {
	printf("Seen %c when %s expected.\n", ch, s); exit(1);
}

int main() {
	
	do {
		get_char();
		expression();
		if ( ch != '.' ) error (".");
	} while ( 1 );

	return 0;
}


