#include #include #include #include using namespace std; struct madtoken{ string token; int type; //0 WORD //1 [ //2 VALUEID //3 : //4 PROMPT //5 ] //6 SPACE }; typedef struct madtoken madtoken; void tokenize(string madlib); /* Grammar: madlib: libword+ libword: word | "[" valueid ("]" | ":" prompt) prompt [^\]]+ word [^\[ ]+ valueid: [^\]:]+ */ vector toks; int main() { string madlib; madlib += "[1:a proper noun] woke up. [1] didn't want to [2:a verb] today. "; madlib += "It's [1]'s job to [2], which makes [1] [meh:a feeling]. "; madlib += "[1] wants to work somewhere [3:an adjective] like [4:a company]."; madlib += " [1] plans to do this by conquering [5:a place] with [3] [animal:an animal(plural)]."; madlib += " Then, everyone in [5] will be [meh] just like [1], and live [ly:an adverb] every after."; cout << "Not sane libs!" << endl << endl; map inputs; tokenize(madlib); string story; for(int i=0; i> inputs[toks[i+1].token]; story+=inputs[toks[i+1].token]; i+=4; } break; case 6: story += " "; } } cout << endl << endl << story << endl; } void tokenize(string madlib) { madlib+=" "; madtoken tok; int pos = 0; int state = 0; string token=""; // 0 - madlib // 1 - word // 2 - valueid // 3 - prompt while(pos < madlib.length()) { switch(state) { case 0: if(madlib[pos]=='[') { pos++; tok.token="["; tok.type=1; toks.push_back(tok); token=""; state=2; //Begin parsing a valueid } else if(madlib[pos]==']') { cerr << "Unexpected ']'" << endl; return; } else if(madlib[pos]!=' ') { state=1; //Begin parsing a word token=""; } else { pos++; tok.type=6; tok.token=" "; toks.push_back(tok); } break; case 1: //word if(madlib[pos]=='[' || madlib[pos] == ' ') { tok.token=token; tok.type=0; toks.push_back(tok); token=""; state=0; } else { token += madlib[pos]; pos++; } break; case 2: //valueid if(madlib[pos] != ']' && madlib[pos] != ':') { token+=madlib[pos]; pos++; } else if(madlib[pos] == ']') { pos++; tok.token=token; tok.type=2; toks.push_back(tok); tok.token="]"; tok.type=5; // ']' toks.push_back(tok); token="]"; state=0; } else if(madlib[pos] == ':') { pos++; tok.token=token; tok.type=2; toks.push_back(tok); tok.token=":"; tok.type=3; // ':' toks.push_back(tok); token=""; state=3; // start parsing prompt; } else { cerr << "Expected ']' or ':', found '" << madlib[pos] << "'" << endl; return; } break; case 3: //prompt (string w/ spaces) if(madlib[pos]!=']') { token+=madlib[pos]; pos++; } else { pos++; tok.token=token; tok.type=4; toks.push_back(tok); tok.token="]"; tok.type=5; // ']' toks.push_back(tok); state=0; } } } }