Hello! I'm trying to recognize string literal by reading string per symbol.
Here is a sample code:
#region [String Literal (")]
case '"': // {string literal ""}
{
// skipping '"'
ChCurrent = Line.ElementAtOrDefault<Char>(++ChPosition);
while(ChCurrent != '"')
{
Value.Append(ChCurrent);
ChCurrent = Line.ElementAtOrDefault<Char>(++ChPosition);
if(ChCurrent == '"')
{
// "" sequence only acceptable
if(Line.ElementAtOrDefault<Char>(ChPosition + 1) == '"')
{
Value.Append(ChCurrent);
// skip 2nd double quote
ChPosition++;
// move position next
ChCurrent = Line.ElementAtOrDefault<Char>(++ChPosition);
}
}
else if(default(Char) == ChCurrent)
{
// message: unterminated string
throw new ScanningException();
}
}
ChPosition++;
break;
}
#endregion
When I run test:
[Test]
[ExpectedException(typeof(ScanningException))]
public void ScanDoubleQuotedStrings()
{
this.Scanner.Run(@"""Hello Language Design""", default(System.Int32));
this.Scanner.Run(@"""Is there any problems with the """"strings""""?""", default(System.Int32));
this.Scanner.Run(@"""v#:';?325;.<>,|+_)""(*&^%$#@![]{}\|-_=""", default(System.Int32));
while(0 != this.Scanner.TokensCount - 1)
{
Assert.AreEqual(Token.TokenClass.StringLiteral, this.Scanner.NextToken.Class);
}
}
It passes with success.. while I'm expecting to have an exception according to unmatched " mark in
this.Scanner.Run(@"""v#:';?325;.<>,|+_)""(*&^%$#@![]{}\|-_=""", default(System.Int32));
Can anyone explain where is my mistake or give an advice on algorithm.