MCPcopy Create free account
hub / github.com/catboost/catboost / CorrectDelimiters

Function CorrectDelimiters

library/cpp/tokenizer/multitokenutil.cpp:88–148  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

86}
87
88void 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));

Callers 2

AddTokenMethod · 0.85
AddSubtokenMethod · 0.85

Calls 1

EndPosMethod · 0.80

Tested by

no test coverage detected