auto_ptr<Rule> exstatik::CreateLexer_Seq() { auto_ptr<Rule> lexer(SEQ("seq")); lexer->AddChild(KEYWORD("cat")); lexer->AddChild(KEYWORD("dog")); Rule* optmoo = lexer->AddChild(OPT("opt")); optmoo->AddChild(KEYWORD("moo")); lexer->AddChild(KEYWORD("car")); return lexer; }
// parser = ((cmd|codeblock)end)* auto_ptr<Rule> exstatik::CreateParser_Complex() { auto_ptr<Rule> parser(STAR("parser")); Rule* line = parser->AddChild(SEQ("line")); //line->AddChild(META("WS")); Rule* cmdorcode = line->AddChild(OR("Or (cmdorcode)")); Rule* end = line->AddChild(OR("end")); end->AddChild(META(";")); end->AddChild(META("\n")); Rule* cmdline = cmdorcode->AddChild(SEQ("cmdline")); cmdline->AddChild(META("ID", "program")); Rule* cmdargs = cmdline->AddChild(STAR("* (cmdargs)")); Rule* cmdarg = cmdargs->AddChild(SEQ("cmdarg")); cmdarg->AddChild(META("WS")); cmdarg->AddChild(META("arg")); Rule* codeblock = cmdorcode->AddChild(SEQ("codeblock")); codeblock->AddChild(META("{")); Rule* stmts = codeblock->AddChild(STAR("* (stmts)")); codeblock->AddChild(META("}")); Rule* stmt = stmts->AddChild(OR("Or (stmt)")); Rule* newstmt = stmt->AddChild(SEQ("new stmt")); newstmt->AddChild(META("new")); newstmt->AddChild(META("WS")); newstmt->AddChild(META("identifier", "ID")); newstmt->AddChild(META(";")); Rule* delstmt = stmt->AddChild(SEQ("del stmt")); delstmt->AddChild(META("del")); delstmt->AddChild(META("WS")); delstmt->AddChild(META("identifier", "ID")); delstmt->AddChild(META(";")); return parser; }