#include <stdio.h>
#include "dfa.h"

void dfa(), dfa_rules(), rule(), rest(), strings(), strings1(), string(),dfa_r1();

/* Grammar (unconverted)
dfa --> dfa_rules EOL strings
dfa_rules --> dfa_rules rule
	|     rule
rule -->  NT PRODUCE T NT EOL
	| NT PRODUCE EOL
strings -->  strings string EOL
	|  string EOL
string --> string T
	|  
*/
/* LL Grammar  and predict sets
dfa --> dfa_rules EOL strings		{NT}
dfa_rules --> rule dfa_r1		{NT}
dfa_r1    --> rule dfa_r1		{NT}
        |				{EOL}
rule -->  NT PRODUCE rest 		{NT}
rest --> T NT EOL			{T}
	| EOL				{EOL}
strings -->  string EOL strings1	{T}
strings1 --> string EOL strings1	{T}
	|				{$}
string --> T string			{T}
	|				{EOL}
*/
int lookahead;

extern int yylex(); 

int main() {
  lookahead = yylex();
  dfa();
  if (lookahead != 0) /* eof */
    printf("Extra tokens: String rejected\n");
  else printf("String accepted\n");
}

void error() {
  printf("syntax error: String rejected");
  exit(2);
}

void match(int token) {
  if (token == lookahead) lookahead = yylex();
  else error();
}

void dfa() {
  if (lookahead == NT) { dfa_rules(); match(EOL); strings(); }
  else error();
}

void dfa_rules() {
  if (lookahead == NT) {rule(); dfa_r1(); }
  else error();
}

void dfa_r1() {
   if (lookahead == NT) { rule(); dfa_r1(); }
   else if (lookahead == EOL) return;
   else error();
}

void rule() {
   match(NT); match(PRODUCE); rest();
}

void rest() {
  if (lookahead == T) {match(T); match(NT); match(EOL);}
  else if (lookahead == EOL) match(EOL);
  else error();
}

void strings() {
  if ((lookahead == T)||(lookahead == EOL)) {
    string(); match(EOL); strings1();
  }else error();
}
void strings1() {
  if ((lookahead == T)||(lookahead == EOL)) {
     string(); match(EOL); strings1();
  } else if (lookahead == 0) return;
  else error();
}
 
void string() {
  if (lookahead == T) {match(T); string(); }
  else if (lookahead == EOL) return;
  else error();
}


