// This program contains functions to create a DFA, given // a regular grammar, and to simulate the resulting // DFA on a given input string. There are classes // to represent DFAs, regular grammars, and grammar // rules. This file contains the test program. // Nonterminals are represented as strings, terminals // as characters, using typedef in each case. // The program assumes that the start symbol of a // grammar must be called "S". #include "stdafx.h" #include "dfa.h" #include // disable debug name truncation warnings #pragma warning(disable: 4786) int main(int argc, char* argv[]) { // reg expr: l(l+n)* grammar *g=new grammar(); g->addRule(new rule("S",'l',"A")); g->addRule(new rule("S",'l')); g->addRule(new rule("A",'l',"A")); g->addRule(new rule("A",'l')); g->addRule(new rule("A",'n',"A")); g->addRule(new rule("A",'n')); dfa *d=g->buildDFA(); d->testStringAndPrint("l"); d->testStringAndPrint("ll"); d->testStringAndPrint("ln"); d->testStringAndPrint("lnnn"); d->testStringAndPrint("llnnn"); d->testStringAndPrint("lnnln"); d->testStringAndPrint("lxnnn"); d->testStringAndPrint("nnn"); d->testStringAndPrint("nlnl"); cout << endl; delete g; delete d; // reg expr: ln* g=new grammar(); g->addRule(new rule("S",'l',"A")); g->addRule(new rule("S",'l')); g->addRule(new rule("A",'n',"A")); g->addRule(new rule("A",'n')); d=g->buildDFA(); d->testStringAndPrint("l"); d->testStringAndPrint("ln"); d->testStringAndPrint("lnnn"); d->testStringAndPrint("ll"); d->testStringAndPrint("nnn"); d->testStringAndPrint("llnnn"); d->testStringAndPrint("lnnln"); d->testStringAndPrint("lxnnn"); cout << endl; delete g; delete d; // reg expr: in + out + in_out g=new grammar(); g->addRule(new rule("S",'i',"A")); g->addRule(new rule("S",'o',"B")); g->addRule(new rule("A",'n',"C")); g->addRule(new rule("A",'n')); g->addRule(new rule("C",'_',"D")); g->addRule(new rule("D",'o',"B")); g->addRule(new rule("B",'u',"E")); g->addRule(new rule("E",'t')); d=g->buildDFA(); d->testStringAndPrint("in"); d->testStringAndPrint("out"); d->testStringAndPrint("in_out"); d->testStringAndPrint("in_"); d->testStringAndPrint("out_in"); d->testStringAndPrint("i"); d->testStringAndPrint("on"); cout << endl; delete g; delete d; // reg expr: dd* + dd*.d* g=new grammar(); g->addRule(new rule("S",'d',"A")); g->addRule(new rule("S",'d')); g->addRule(new rule("A",'d',"A")); g->addRule(new rule("A",'d')); g->addRule(new rule("A",'.',"B")); g->addRule(new rule("A",'.')); g->addRule(new rule("B",'d',"B")); g->addRule(new rule("B",'d')); d=g->buildDFA(); d->testStringAndPrint("d"); d->testStringAndPrint("dd"); d->testStringAndPrint("ddd"); d->testStringAndPrint("dddd"); d->testStringAndPrint("d.d"); d->testStringAndPrint("d.dd"); d->testStringAndPrint("dd."); d->testStringAndPrint(".dd"); d->testStringAndPrint("d.d.d"); d->testStringAndPrint("dd..dd"); cout << endl; delete g; delete d; // reg expr: // [-](dd* + dd*.dd*e[-]dd) g=new grammar(); g->addRule(new rule("S",'d',"A")); g->addRule(new rule("S",'d')); g->addRule(new rule("S",'-',"B")); g->addRule(new rule("A",'d',"A")); g->addRule(new rule("A",'d')); g->addRule(new rule("B",'d',"A")); g->addRule(new rule("B",'d')); g->addRule(new rule("A",'.',"C")); g->addRule(new rule("B",'d')); g->addRule(new rule("C",'d',"D")); g->addRule(new rule("C",'d')); g->addRule(new rule("D",'d',"D")); g->addRule(new rule("D",'d')); g->addRule(new rule("D",'e',"E")); g->addRule(new rule("E",'-',"F")); g->addRule(new rule("E",'d',"H")); g->addRule(new rule("F",'d',"G")); g->addRule(new rule("G",'d')); g->addRule(new rule("H",'d')); d=g->buildDFA(); d->testStringAndPrint("d"); d->testStringAndPrint("dd"); d->testStringAndPrint("ddd"); d->testStringAndPrint("dddd"); d->testStringAndPrint("-d"); d->testStringAndPrint("d.d"); d->testStringAndPrint("-d.d"); d->testStringAndPrint("d.dd"); d->testStringAndPrint("-d.dd"); d->testStringAndPrint("ddd.dd"); d->testStringAndPrint("dd.dedd"); d->testStringAndPrint("-ddd.dde-dd"); d->testStringAndPrint("dd."); d->testStringAndPrint(".dd"); d->testStringAndPrint("-d."); d->testStringAndPrint("d-dd"); d->testStringAndPrint("d.d.d"); d->testStringAndPrint("ddedd"); d->testStringAndPrint("d.ded.d"); d->testStringAndPrint("dd.de-d"); d->testStringAndPrint("ddd.ddeddd"); d->testStringAndPrint("dd.ded.dedd"); delete g; delete d; return 0; }