#include <stdio.h>

	char *PgmName=0; int ShowLit=0;
	int ShowProd=1; int ShowBNF=0;
	int ProdNbr=0; int FirstProd=0;
	int ErrorCnt=0;

	char pc='x';
	char cc;
	int lp=0;

	void
	main(argc, argv)
	int argc;
	char **argv;
	{
		PgmName = *argv;
		--argc, ++argv;
		while (argc && ((**argv == '-') || (**argv == '+'))) {
			char *cp=&argv[0][1];

			while (*cp) {
				switch (*cp) {
				default:
					exit(-1);
				}
				++cp;
			}
			--argc, ++argv;
		}
		if (argc && (freopen(*argv, "r", stdin) == NULL)) {
			perror(PgmName);
			exit(-1);
		}
		yylex();
		exit(ErrorCnt);
	}

%%
[a-z][a-z0-9A-Z_]*		NonTerminal(yytext);
"KW_"[A-Z][A-Z0-9_]*	Keyword(yytext);
[A-Z][A-Z0-9_]*			Terminal(yytext);
":"$				printf(" ::= ");
"'"."'"				printf("\"%c\"", yytext[1]);

.|"\n"				ECHO;
%%

int 
NonTerminal(char* text)
{
    printf("<%s>", text);
}

int 
Terminal(char* text)
{
    char *my_text, *malloc();
    char c;
    int i;

    my_text = malloc(strlen(text)+1);
    my_text[0] = text[0];

    // ASCII conversion to lower case
    for (i=1; (c = text[i]) != '\0'; i++) {
	if ( 'A' <= c && c <= 'Z' ) {
	    my_text[i] = 'a' + c - 'A'; } 
	else  {
	    my_text[i] = c;
	} 
    }
    my_text[i] = c;

    printf("<%s>", my_text);
    free(my_text);
}

int 
Keyword(char* text)
{
    char *my_text, *malloc();
    char c;
    int i;
    my_text = malloc(strlen(text)+1);

    // ASCII conversion to lower case
    for (i=0; (c = text[i+3]) != '\0'; i++) {
	if ( 'A' <= c && c <= 'Z' ) {
	    my_text[i] = 'a' + c - 'A'; } 
	else  {
	    my_text[i] = c;
	} 
    }
    my_text[i] = c;

    printf("\"%s\"", my_text);
    free(my_text);
}


int
check(char cc)
  {
    if( pc!='\'' )
    {
      switch(cc) {
      case '{':
	lp++;
	break;

      case '}':
	lp--;
	break;

      default:
	if (lp==0) ECHO;
	break;
      }
    }
    else
    {  if (lp==0) ECHO;
    };

    pc = cc;
  }