#include #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(); }