static myPaserResult myparser2(string line) { //state table //state |token // |, |" |other //------+-------+-------+------ //s |s |a |e //a |a |b |a //b |s |a |invalid //e |s |invalid|e myPaserResult res = new myPaserResult(); myState cur = myState.s; myState nState = myState.s; foreach (char c in line) { myToken tk = new myToken(c); cur = nState; nState = tbl[(int)cur, (int)tk.type]; if (nState == myState.invalid) { break; } myRule cb = clbTbl[(int)cur, (int)tk.type]; cb(res, tk); } //case eol return(res); }
static myPaserResult myparser2(string line) { //state table //state |token // |, |" |other //------+-------+-------+------ //s |s |a |e //a |a |b |a //b |s |a |invalid //e |s |invalid|e myPaserResult res = new myPaserResult(line); myState cur = myState.s; myState nState = myState.s; foreach (char c in line) { myTkType type; #if false myToken tk = new myToken(c); type = tk.type; #else switch (c) { case '"': type = myTkType.t_dblq; break; case ',': type = myTkType.t_comma; break; default: type = myTkType.t_other; break; } #endif cur = nState; nState = tbl[(int)cur, (int)type]; if (nState == myState.invalid) { break; } myRule cb = clbTbl[(int)cur, (int)type]; cb(res, null); } //case eol return(res); }