| 3 | |
| 4 | template <typename TChr> |
| 5 | static NLP_TYPE GuessTypeByWordT(const TChr* w, size_t len) { |
| 6 | // NLP_WORD |
| 7 | // NLP_INTEGER |
| 8 | // NLP_FLOAT |
| 9 | // NLP_MARK |
| 10 | |
| 11 | //integer {digit}+ |
| 12 | //fixed {digit}+"."{digit}+ |
| 13 | enum EState { |
| 14 | G_START, |
| 15 | G_INT, |
| 16 | G_DOT, |
| 17 | G_FRAC, |
| 18 | }; |
| 19 | EState state = G_START; |
| 20 | |
| 21 | static const TChr DIGITS[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 0}; |
| 22 | static const TBasicStringBuf<TChr> DIGITS_BUF{DIGITS}; |
| 23 | |
| 24 | for (unsigned i = 0; i < len; ++i) { |
| 25 | TChr c = w[i]; |
| 26 | bool bIsDigit = DIGITS_BUF.Contains(c); |
| 27 | switch (state) { |
| 28 | case G_START: |
| 29 | if (bIsDigit) |
| 30 | state = G_INT; |
| 31 | else { |
| 32 | if (TBasicStringBuf<TChr>(w, len).find_first_of(DIGITS_BUF) >= len) |
| 33 | return NLP_WORD; |
| 34 | else |
| 35 | return NLP_MARK; |
| 36 | } |
| 37 | break; |
| 38 | case G_INT: |
| 39 | if (bIsDigit) |
| 40 | break; |
| 41 | else if (c == '.') |
| 42 | state = G_DOT; |
| 43 | else |
| 44 | return NLP_MARK; |
| 45 | break; |
| 46 | case G_DOT: |
| 47 | if (bIsDigit) |
| 48 | state = G_FRAC; |
| 49 | else |
| 50 | return NLP_MARK; |
| 51 | break; |
| 52 | case G_FRAC: |
| 53 | if (bIsDigit) |
| 54 | break; |
| 55 | else |
| 56 | return NLP_MARK; |
| 57 | break; |
| 58 | } |
| 59 | } |
| 60 | switch (state) { |
| 61 | case G_START: |
| 62 | return NLP_MARK; |
no test coverage detected