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