Skip to content

Commit 2ed8e70

Browse files
rickardpglennblock
authored andcommitted
scriptcs#1143. Char literals does not take escape sequences into account (scriptcs#1144)
* scriptcs#1143: Char literals does not take escape sequences into account * scriptcs#1143: Added unit test for problem and added a fix to not break another unit test that is checking that broken input is to be accepted
1 parent 7fcebf2 commit 2ed8e70

2 files changed

Lines changed: 24 additions & 6 deletions

File tree

src/ScriptCs.Engine.Mono/Segmenter/Lexer/ScriptLexer.cs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -72,14 +72,18 @@ public LexerResult GetToken()
7272
string @char = string.Empty;
7373
@char += (char)_lastChar;
7474

75-
_lastChar = Read();
76-
int count = 0;
77-
while (count < 2 && _lastChar != Token.Eof)
75+
int previous;
76+
do
7877
{
79-
count++;
80-
@char += (char)_lastChar;
78+
previous = _lastChar;
8179
_lastChar = Read();
82-
}
80+
if(_lastChar != Token.Eof)
81+
@char += (char)_lastChar;
82+
} while (!(_lastChar == Token.SingleQuote && previous != Token.EscapeChar)
83+
&& _lastChar != Token.Eof);
84+
85+
if(_lastChar != Token.Eof)
86+
_lastChar = Read(); //eat
8387

8488
return new LexerResult
8589
{

test/ScriptCs.Engine.Mono.Tests/Segmenter/ScriptLexerTests.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,20 @@ public void ShouldIdenityCharactersAsToken()
129129
token.TokenValue.ShouldEqual(Code);
130130
}
131131

132+
[Fact]
133+
public void ShouldIdentifyEscapeSequencesInCharacterLiterals()
134+
{
135+
const string Code = "\'\\t\'";
136+
137+
var lexer = new ScriptLexer(Code);
138+
var token = lexer.GetToken();
139+
140+
token.Token.ShouldEqual(Token.Character);
141+
token.Start.ShouldEqual(0);
142+
token.End.ShouldEqual(4);
143+
token.TokenValue.ShouldEqual(Code);
144+
}
145+
132146
[Fact]
133147
public void ShouldNotFailOnIdentifyingCharactersAsToken()
134148
{

0 commit comments

Comments
 (0)