/* CFGrl Version 1 -- converts .cfg-r file to equivalent .cfg file Author: Adam Roegiest Version: 1.0 Input: .cfg-r file with a single derivation Output: .cfg file with abbreviated forward leftmost version of the derivation Literal translation of CFGrl Version 2 by Ondrej Lhotak. Available (currently) at: http://w...content-available-to-author-only...o.ca/~cs241/a08/CFGrl.java */ #include <set> #include <string> #include <iostream> #include <list> #include <sstream> #include <stack> using namespace std; set<string> terms; set<string> nonterms; set<string> prods; string start; struct Tree { string rule; list<Tree*> children; ~Tree() { for(list<Tree*>::iterator it=children.begin(); it != children.end(); it++) { // delete all subtrees delete (*it); } } }; void readsyms(set<string> &t) { int n; string temp; getline(cin,temp); istringstream iss(temp); iss >> n; if (iss.fail()) return; for(int i = 0; i < n; i++) { getline(cin,temp); t.insert(temp); } } void traverse(Tree *t, int d) { for(int i = 0; i < d; i++) cout << " "; cout << t->rule << endl; // print root for(list<Tree*>::iterator it=(t->children).begin(); it != (t->children).end(); it++) { // print all subtrees traverse(*it, d+1); } } void dump(set<string> &h) { cout << h.size() << endl; for(set<string>::iterator it=h.begin(); it != h.end(); it++) { cout << *it << endl; } } void popper(stack<Tree *> &myStack, list<string> &rhs, string rule) { Tree *n = new Tree(); n->rule = rule; for(list<string>::iterator it=rhs.begin(); it != rhs.end(); it++){ Tree *tmp = myStack.top(); n->children.push_front(tmp); myStack.pop(); } myStack.push(n); } Tree* lrdo() { stack<Tree*> myStack; string l; // lhs symbol do { string f; getline(cin,f); list<string> r; // rhs symbols istringstream iss(f); iss >> l; // lhs symbol string s; while(iss >> s) { if(nonterms.count(s) > 0) r.push_back(s); // only non-terminals } popper(myStack, r, f); // reduce rule } while(start != l); return myStack.top(); } int main(){ readsyms(terms); // read terminals readsyms(nonterms); // read nonterminals getline(cin,start); // read start symbol readsyms(prods); // read production rules Tree *parsetree = lrdo(); // read reverse rightmost derivation dump(terms); // write terminals in .cfg format dump(nonterms); // write nonterminals cout << start << endl; // write start symbol dump(prods); // write production rules traverse(parsetree, 0); // write forward leftmost derivation delete parsetree; }
35 AMP BECOMES BOF COMMA DELETE ELSE EOF EQ GE GT ID IF INT LBRACE LBRACK LE LPAREN LT MINUS NE NEW NULL NUM PCT PLUS PRINTLN RBRACE RBRACK RETURN RPAREN SEMI SLASH STAR WAIN WHILE 17 start dcl dcls expr factor lvalue procedure procedures main params paramlist statement statements term test type arglist start 49 start BOF procedures EOF procedures procedure procedures procedures main procedure INT ID LPAREN params RPAREN LBRACE dcls statements RETURN expr SEMI RBRACE main INT WAIN LPAREN dcl COMMA dcl RPAREN LBRACE dcls statements RETURN expr SEMI RBRACE params params paramlist paramlist dcl paramlist dcl COMMA paramlist type INT type INT STAR dcls dcls dcls dcl BECOMES NUM SEMI dcls dcls dcl BECOMES NULL SEMI dcl type ID statements statements statements statement statement lvalue BECOMES expr SEMI statement IF LPAREN test RPAREN LBRACE statements RBRACE ELSE LBRACE statements RBRACE statement WHILE LPAREN test RPAREN LBRACE statements RBRACE statement PRINTLN LPAREN expr RPAREN SEMI statement DELETE LBRACK RBRACK expr SEMI test expr EQ expr test expr NE expr test expr LT expr test expr LE expr test expr GE expr test expr GT expr expr term expr expr PLUS term expr expr MINUS term term factor term term STAR factor term term SLASH factor term term PCT factor factor ID factor NUM factor NULL factor LPAREN expr RPAREN factor AMP lvalue factor STAR factor factor NEW INT LBRACK expr RBRACK factor ID LPAREN RPAREN factor ID LPAREN arglist RPAREN arglist expr arglist expr COMMA arglist lvalue ID lvalue STAR factor lvalue LPAREN lvalue RPAREN type INT dcl type ID type INT dcl type ID dcls statements factor ID term factor expr term factor ID term factor factor ID term term STAR factor expr expr PLUS term main INT WAIN LPAREN dcl COMMA dcl RPAREN LBRACE dcls statements RETURN expr SEMI RBRACE procedures main start BOF procedures EOF
35 AMP BECOMES BOF COMMA DELETE ELSE EOF EQ GE GT ID IF INT LBRACE LBRACK LE LPAREN LT MINUS NE NEW NULL NUM PCT PLUS PRINTLN RBRACE RBRACK RETURN RPAREN SEMI SLASH STAR WAIN WHILE 17 arglist dcl dcls expr factor lvalue main paramlist params procedure procedures start statement statements term test type start 49 arglist expr arglist expr COMMA arglist dcl type ID dcls dcls dcls dcl BECOMES NULL SEMI dcls dcls dcl BECOMES NUM SEMI expr expr MINUS term expr expr PLUS term expr term factor AMP lvalue factor ID factor ID LPAREN RPAREN factor ID LPAREN arglist RPAREN factor LPAREN expr RPAREN factor NEW INT LBRACK expr RBRACK factor NULL factor NUM factor STAR factor lvalue ID lvalue LPAREN lvalue RPAREN lvalue STAR factor main INT WAIN LPAREN dcl COMMA dcl RPAREN LBRACE dcls statements RETURN expr SEMI RBRACE paramlist dcl paramlist dcl COMMA paramlist params params paramlist procedure INT ID LPAREN params RPAREN LBRACE dcls statements RETURN expr SEMI RBRACE procedures main procedures procedure procedures start BOF procedures EOF statement DELETE LBRACK RBRACK expr SEMI statement IF LPAREN test RPAREN LBRACE statements RBRACE ELSE LBRACE statements RBRACE statement PRINTLN LPAREN expr RPAREN SEMI statement WHILE LPAREN test RPAREN LBRACE statements RBRACE statement lvalue BECOMES expr SEMI statements statements statements statement term factor term term PCT factor term term SLASH factor term term STAR factor test expr EQ expr test expr GE expr test expr GT expr test expr LE expr test expr LT expr test expr NE expr type INT type INT STAR start BOF procedures EOF procedures main main INT WAIN LPAREN dcl COMMA dcl RPAREN LBRACE dcls statements RETURN expr SEMI RBRACE dcl type ID type INT dcl type ID type INT dcls statements expr expr PLUS term expr term term factor factor ID term term STAR factor term factor factor ID factor ID