| 86 | } |
| 87 | |
| 88 | void CorrectDelimiters(TCharSpan& prevtok, wchar16 suffixChar, TCharSpan& lasttok, wchar16 prefixChar) { |
| 89 | // correct suffix length of the previous token |
| 90 | switch (lasttok.Pos - prevtok.EndPos()) { |
| 91 | case 0: |
| 92 | Y_ASSERT(prevtok.SuffixLen == 0 && prevtok.TokenDelim == TOKDELIM_NULL && lasttok.PrefixLen == 0); |
| 93 | break; |
| 94 | case 1: // only delimiter allowed |
| 95 | if (prevtok.SuffixLen == 1 && prevtok.TokenDelim == TOKDELIM_PLUS) // 'a+b' |
| 96 | prevtok.SuffixLen = 0; |
| 97 | Y_ASSERT( |
| 98 | (prevtok.SuffixLen == 0 && prevtok.TokenDelim != TOKDELIM_NULL && lasttok.PrefixLen == 0) || |
| 99 | (prevtok.SuffixLen == 0 && prevtok.TokenDelim == TOKDELIM_NULL && lasttok.PrefixLen == 0 && prevtok.Hyphen == HYPHEN_SOFT)); |
| 100 | break; |
| 101 | case 2: // only suffix + delimiter OR delimiter + prefix |
| 102 | if (prevtok.SuffixLen == 1 && lasttok.PrefixLen == 1) { // 'a+@b' - delim/prefix, 'a#@b' - suffix/delim |
| 103 | if (suffixChar == '+') { |
| 104 | prevtok.SuffixLen = 0; |
| 105 | prevtok.TokenDelim = TOKDELIM_PLUS; |
| 106 | } else if (suffixChar == '#') { |
| 107 | Y_ASSERT(prefixChar == '@'); // only '@' can be delimiter and prefix |
| 108 | prevtok.TokenDelim = TOKDELIM_AT_SIGN; |
| 109 | lasttok.PrefixLen = 0; |
| 110 | } |
| 111 | } else if (prevtok.SuffixLen == 2) { |
| 112 | prevtok.SuffixLen = 1; |
| 113 | prevtok.TokenDelim = TOKDELIM_PLUS; // since SuffixLen == 2 can be '++' only |
| 114 | } |
| 115 | Y_ASSERT( |
| 116 | (prevtok.SuffixLen == 1 && prevtok.TokenDelim != TOKDELIM_NULL && lasttok.PrefixLen == 0) || |
| 117 | (prevtok.SuffixLen == 0 && prevtok.TokenDelim != TOKDELIM_NULL && lasttok.PrefixLen == 1) || |
| 118 | (prevtok.SuffixLen == 0 && prevtok.TokenDelim == TOKDELIM_NULL && lasttok.PrefixLen == 0 && |
| 119 | (prevtok.Hyphen == HYPHEN_ORDINARY || prevtok.Hyphen == HYPHEN_SOFT))); |
| 120 | break; |
| 121 | case 3: |
| 122 | if (prevtok.SuffixLen == 2 && lasttok.PrefixLen == 1) { // a++/b |
| 123 | if (prevtok.TokenDelim == TOKDELIM_PLUS) // a++/b |
| 124 | prevtok.SuffixLen = 1; |
| 125 | else if (prevtok.TokenDelim == TOKDELIM_AT_SIGN) { // 'a++@b' |
| 126 | prevtok.SuffixLen = 1; |
| 127 | prevtok.TokenDelim = TOKDELIM_PLUS; |
| 128 | } |
| 129 | } |
| 130 | Y_ASSERT( |
| 131 | (prevtok.SuffixLen == 1 && prevtok.TokenDelim != TOKDELIM_NULL && lasttok.PrefixLen == 1) || |
| 132 | (prevtok.SuffixLen == 2 && prevtok.TokenDelim != TOKDELIM_NULL && lasttok.PrefixLen == 0) || |
| 133 | (prevtok.SuffixLen == 0 && prevtok.TokenDelim == TOKDELIM_NULL && lasttok.PrefixLen == 0 && |
| 134 | (prevtok.Hyphen == HYPHEN_ORDINARY || prevtok.Hyphen == HYPHEN_SOFT))); |
| 135 | break; |
| 136 | case 4: |
| 137 | Y_ASSERT( |
| 138 | (prevtok.SuffixLen == 2 && prevtok.TokenDelim != TOKDELIM_NULL && lasttok.PrefixLen == 1) || |
| 139 | (prevtok.SuffixLen == 0 && prevtok.TokenDelim == TOKDELIM_NULL && lasttok.PrefixLen == 0 && |
| 140 | (prevtok.Hyphen == HYPHEN_ORDINARY || prevtok.Hyphen == HYPHEN_SOFT))); |
| 141 | break; |
| 142 | default: |
| 143 | Y_ASSERT( |
| 144 | prevtok.SuffixLen == 0 && prevtok.TokenDelim == TOKDELIM_NULL && lasttok.PrefixLen == 0 && |
| 145 | (prevtok.Hyphen == HYPHEN_ORDINARY || prevtok.Hyphen == HYPHEN_SOFT)); |
no test coverage detected