Rhino.TokenStream.ReadRegExp C# (CSharp) Method

ReadRegExp() private method

Parser calls the method when it gets / or /= in literal context.
Parser calls the method when it gets / or /= in literal context.
private ReadRegExp ( int startToken ) : void
startToken int
return void
		internal virtual void ReadRegExp(int startToken)
		{
			int start = tokenBeg;
			stringBufferTop = 0;
			if (startToken == Token.ASSIGN_DIV)
			{
				// Miss-scanned /=
				AddToString('=');
			}
			else
			{
				if (startToken != Token.DIV)
				{
					Kit.CodeBug();
				}
			}
			bool inCharSet = false;
			// true if inside a '['..']' pair
			int c;
			while ((c = GetChar()) != '/' || inCharSet)
			{
				if (c == '\n' || c == EOF_CHAR)
				{
					UngetChar(c);
					tokenEnd = cursor - 1;
					this.@string = new string(stringBuffer, 0, stringBufferTop);
					parser.ReportError("msg.unterminated.re.lit");
					return;
				}
				if (c == '\\')
				{
					AddToString(c);
					c = GetChar();
				}
				else
				{
					if (c == '[')
					{
						inCharSet = true;
					}
					else
					{
						if (c == ']')
						{
							inCharSet = false;
						}
					}
				}
				AddToString(c);
			}
			int reEnd = stringBufferTop;
			while (true)
			{
				if (MatchChar('g'))
				{
					AddToString('g');
				}
				else
				{
					if (MatchChar('i'))
					{
						AddToString('i');
					}
					else
					{
						if (MatchChar('m'))
						{
							AddToString('m');
						}
						else
						{
							if (MatchChar('y'))
							{
								// FireFox 3
								AddToString('y');
							}
							else
							{
								break;
							}
						}
					}
				}
			}
			tokenEnd = start + stringBufferTop + 2;
			// include slashes
			if (IsAlpha(PeekChar()))
			{
				parser.ReportError("msg.invalid.re.flag");
			}
			this.@string = new string(stringBuffer, 0, reEnd);
			this.regExpFlags = new string(stringBuffer, reEnd, stringBufferTop - reEnd);
		}