internal Parser(int numSwitches) { _switches = new SwitchResult[numSwitches]; for (int i = 0; i < numSwitches; i++) { _switches[i] = new SwitchResult(); } }
bool ParseString(string srcString, SwitchForm[] switchForms) { int len = srcString.Length; if (len == 0) { return(false); } int pos = 0; if (!IsItSwitchChar(srcString[pos])) { return(false); } while (pos < len) { if (IsItSwitchChar(srcString[pos])) { pos++; } const int kNoLen = -1; int matchedSwitchIndex = 0; int maxLen = kNoLen; for (int switchIndex = 0; switchIndex < _switches.Length; switchIndex++) { int switchLen = switchForms[switchIndex].IDString.Length; if (switchLen <= maxLen || pos + switchLen > len) { continue; } if (String.Compare(switchForms[switchIndex].IDString, 0, srcString, pos, switchLen, StringComparison.CurrentCulture) == 0) { matchedSwitchIndex = switchIndex; maxLen = switchLen; } } if (maxLen == kNoLen) { throw new Exception("maxLen == kNoLen"); } SwitchResult matchedSwitch = _switches[matchedSwitchIndex]; SwitchForm switchForm = switchForms[matchedSwitchIndex]; if ((!switchForm.Multi) && matchedSwitch.ThereIs) { throw new Exception("switch must be single"); } matchedSwitch.ThereIs = true; pos += maxLen; int tailSize = len - pos; SwitchType type = switchForm.Type; switch (type) { case SwitchType.PostMinus: { if (tailSize == 0) { matchedSwitch.WithMinus = false; } else { matchedSwitch.WithMinus = (srcString[pos] == kSwitchMinus); if (matchedSwitch.WithMinus) { pos++; } } break; } case SwitchType.PostChar: { if (tailSize < switchForm.MinLen) { throw new Exception("switch is not full"); } string charSet = switchForm.PostCharSet; const int kEmptyCharValue = -1; if (tailSize == 0) { matchedSwitch.PostCharIndex = kEmptyCharValue; } else { int index = charSet.IndexOf(srcString[pos]); if (index < 0) { matchedSwitch.PostCharIndex = kEmptyCharValue; } else { matchedSwitch.PostCharIndex = index; pos++; } } break; } case SwitchType.LimitedPostString: case SwitchType.UnLimitedPostString: { int minLen = switchForm.MinLen; if (tailSize < minLen) { throw new Exception("switch is not full"); } if (type == SwitchType.UnLimitedPostString) { matchedSwitch.PostStrings.Add(srcString.Substring(pos)); return(true); } String stringSwitch = srcString.Substring(pos, minLen); pos += minLen; for (int i = minLen; i < switchForm.MaxLen && pos < len; i++, pos++) { char c = srcString[pos]; if (IsItSwitchChar(c)) { break; } stringSwitch += c; } matchedSwitch.PostStrings.Add(stringSwitch); break; } } } return(true); }
internal Parser(int numSwitches) { _switches = new SwitchResult[numSwitches]; for (int i = 0; i < numSwitches; i++) _switches[i] = new SwitchResult(); }