Ano, to bol zjednoduseni priklad, nechcel som zverejnit original kod, ale sak preco nie, aj tak bude kazdemu na dve veci, za formatovanie sa ospravedlnujem, rozpadlo sa:
*static* Token Scan() { *int* state, *apx*; *StringBuffer* buf; *while* (*ignore*.get((*int*)*ch*)) *NextCh*(); *if* ((*ch* == '/') && *Comment*()) *return* *Scan*(); *t* = *new* Token(); *t*.pos = *pos*; *t*.col = *pos* - *lineStart* + 1 - *offset*; *t*.line = * line*; buf = *new* StringBuffer(); state = *start*[*ch*]; apx = 0; loop: *for* (;;) { buf.append(*strCh*); *NextCh*(); *switch* (state) { *case* 0: {*t*.kind = *noSym*; *break* loop;} // NextCh already done *case* 1: *if* (*ch* == '-' || *ch* >= '0' && *ch* <= '9' || *ch* >= 'A' && *ch* <= 'Z' || *ch* == '_' || *ch* >= 'a' && *ch* <= 'z') {*break*;} *else* *if* (*ch* == '/') {state = 15; *break*;} *else* {*t*.kind = 1; *CheckLiteral*(buf); *break* loop;} *case* 2: *if* (*ch* >= '0' && *ch* <= '9') {state = 3; *break*;} *else* {*t*.kind = *noSym*; *break* loop;} *case* 3: *if* (*ch* >= '0' && *ch* <= '9') {*break*;} *else* *if* (*ch* == '.') {state = 4; *break*;} *else* {*t*.kind = *noSym*; *break* loop;} *case* 4: *if* (*ch* >= '0' && *ch* <= '9') {state = 5; *break*;} *else* {*t*.kind = *noSym*; *break* loop;} *case* 5: *if* (*ch* >= '0' && *ch* <= '9') {*break*;} *else* {*t*.kind = 3; *break* loop;} *case* 6: *if* (*ch* <= 9 || *ch* >= 11 && *ch* <= 12 || *ch* >= 14 && *ch* <= '!' || *ch* >= '#') {*break*;} *else* *if* (*ch* == '"') {state = 8; *break*;} *else* {*t*.kind = *noSym*; *break* loop;} *case* 7: *if* (*ch* <= 9 || *ch* >= 11 && *ch* <= 12 || *ch* >= 14 && *ch* <= '&' || *ch* >= '(') {*break*;} *else* *if* (*ch* == 39) {state = 8; *break*;} *else* {*t*.kind = *noSym*; *break* loop;} *case* 8: {*t*.kind = 4; *break* loop;} *case* 9: *if* (*ch* >= '0' && *ch* <= '9') {*break*;} *else* *if* (*ch* == '.') {state = 4; *break*;} *else* {*t*.kind = 2; *break* loop;} *case* 10: {*t*.kind = 7; *break* loop;} *case* 11: {*t*.kind = 12; *break* loop;} *case* 12: {*t*.kind = 13; *break* loop;} *case* 13: {*t*.kind = 14; *break* loop;} *case* 14: {*t*.kind = 15; *break* loop;} *case* 15: *if* (*ch* == 'F') {state = 16; *break*;} *else* {*t*.kind = *noSym*; *break* loop;} *case* 16: *if* (*ch* == 'I') {state = 17; *break*;} *else* {*t*.kind = *noSym*; *break* loop;} *case* 17: *if* (*ch* == 'N') {state = 18; *break*;} *else* {*t*.kind = *noSym*; *break* loop;} *case* 18: *if* (*ch* == 'P') {state = 19; *break*;} *else* {*t*.kind = *noSym*; *break* loop;} *case* 19: *if* (*ch* == 'E') {state = 20; *break*;} *else* {*t*.kind = *noSym*; *break* loop;} *case* 20: *if* (*ch* == 'R') {state = 21; *break*;} *else* {*t*.kind = *noSym*; *break* loop;} *case* 21: *if* (*ch* == 'I') {state = 22; *break*;} *else* {*t*.kind = *noSym*; *break* loop;} *case* 22: *if* (*ch* == 'O') {state = 23; *break*;} *else* {*t*.kind = *noSym*; *break* loop;} *case* 23: *if* (*ch* == 'D') {state = 24; *break*;} *else* {*t*.kind = *noSym*; *break* loop;} *case* 24: {*t*.kind = 19; *break* loop;} *case* 25: {*t*.kind = 27; *break* loop;} *case* 26: {*t*.kind = 28; *break* loop;} *case* 27: {*t*.kind = 29; *break* loop;} *case* 28: {*t*.kind = 30; *break* loop;} *case* 29: {*t*.kind = 0; *break* loop;} } } *t*.str = buf.toString(); *t*.val = *t*.str.toUpperCase(); *return* *t*; } 2011/4/11 "Zdeněk Troníček" <troni...@fit.cvut.cz> > Ahoj, > > automat by měl mít číst něco ze vstupu. Nechybí tam někde vstup? > > Z. > -- > Zdenek Tronicek > FIT CTU in Prague > > > Tomas Studva napsal(a): > > Dobry den, > > vedeli by ste si precitat nasledovny program. Nie je to priklad zo skoly > > ale > > z praxe. Implementacia stavoveho automatu, kod je stary 10 rokov a > > samozrejme ze to je len nezmyselny uryvok. > > > > state = -1; > > > > loop: *for* (;;) { > > > > state = state + 1; > > > > *switch* (state) { > > > > *case* 0: state = 1; break; > > > > case 1: state = 0 *break*; > > > > case 2: break loop; > > > > } > > > > } > > > > Pre mna to je nieco velmi vynimocne, lebo je tam navestie a tiez ten for. > > > > S pozdravom Tomas > > > >