/* A test program for the grammar, symbol, and related classes of Assignment 4, CS 152, Fall 2003 */ #include "symbol.h" #include "rule.h" #include "grammar.h" #include using namespace std; int main() { // This is a grammar for a fragment of English // The rules are: // S -> NP VP // NP -> Det N | Det N PP // PP -> P NP // VP -> V | V NP | V PP // // Note that the lexical categories P, V, N, and Det // are treated as terminal symbols const symbol s = symbol("s"); const symbol vp = symbol("vp"); const symbol np = symbol("np"); const symbol pp = symbol("pp"); const symbol n = symbol("n"); const symbol det = symbol("det"); const symbol v = symbol("v"); const symbol p = symbol("p"); grammar g0 = grammar(s); g0.addNonterminal(np); g0.addNonterminal(vp); g0.addNonterminal(pp); g0.addRule(s,np,vp); g0.addRule(np,det,n); g0.addRule(np,det,n,pp); g0.addRule(vp,v); g0.addRule(vp,v,np); g0.addRule(vp,v,pp); g0.addRule(vp,v,np,pp); g0.addRule(pp,p,np); yields l0 = g0.getYields(s,3); cout << l0; cout << endl; cleanup(l0); l0 = g0.getYields(s,4); cout << l0; cout << endl; cleanup(l0); l0 = g0.getYields(s,5); cout << l0; cout << endl; cleanup(l0); l0 = g0.getYields(s,6); cout << l0; cout << endl; cleanup(l0); l0 = g0.getYields(s,7); cout << l0; cout << endl; cleanup(l0); l0 = g0.getYields(vp,6); cout << l0; cout << endl; cleanup(l0); l0 = g0.getYields(s,8); cout << l0; cout << endl; cleanup(l0); cleanup(g0); // This is a simple grammar with rules // S -> x | x S S // Note that the symbol s is already defined const symbol x = symbol("x"); grammar g1 = grammar(s); g1.addRule(s,x,s,s); g1.addRule(s,x); l0 = g1.getYields(s,3); cout << l0; cout << endl; cleanup(l0); l0 = g1.getYields(s,5); cout << l0; cout << endl; cleanup(l0); l0 = g1.getYields(s,6); cout << l0; cout << endl; cleanup(l0); l0 = g1.getYields(s,7); cout << l0; cout << endl; cleanup(l0); l0 = g1.getYields(vp,6); cout << l0; cout << endl; cleanup(l0); cleanup(g1); // This is a grammar for simple algebraic expressions. // Its rules are // E -> T | T + E // T -> F | F * T // F -> x | y | < E > // Note that the symbol x is already defined. const symbol e = symbol("e"); const symbol t = symbol("t"); const symbol f = symbol("f"); const symbol y = symbol("y"); const symbol plus = symbol("+"); const symbol times = symbol("*"); const symbol lt = symbol("<"); const symbol gt = symbol(">"); grammar g2 = grammar(e); g2.addNonterminal(t); g2.addNonterminal(f); g2.addRule(e,t); g2.addRule(e,t,plus,e); g2.addRule(t,f); g2.addRule(t,f,times,t); g2.addRule(f,x); g2.addRule(f,y); g2.addRule(f,lt,e,gt); l0 = g2.getYields(e,1); cout << l0; cout << endl; cleanup(l0); l0 = g2.getYields(e,3); cout << l0; cout << endl; cleanup(l0); l0 = g2.getYields(e,4); cout << l0; cout << endl; cleanup(l0); l0 = g2.getYields(e,5); cout << l0; cout << endl; cleanup(l0); cout << l0.size() << endl; cleanup(g2); return 0; }