/* 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