py/lexer: Process CR earlier to allow newlines checks on chr1.

Resolves an issue where lexer failed to accept CR after line continuation
character.  It also simplifies the code.
This commit is contained in:
Tom Collins 2017-05-09 13:19:46 -07:00 committed by Damien George
parent 5feeba8897
commit 6f56412ec3

View File

@ -137,24 +137,19 @@ STATIC void next_char(mp_lexer_t *lex) {
lex->chr1 = lex->chr2;
lex->chr2 = lex->reader.readbyte(lex->reader.data);
if (lex->chr0 == '\r') {
if (lex->chr1 == '\r') {
// CR is a new line, converted to LF
lex->chr0 = '\n';
if (lex->chr1 == '\n') {
// CR LF is a single new line
lex->chr1 = lex->chr2;
lex->chr1 = '\n';
if (lex->chr2 == '\n') {
// CR LF is a single new line, throw out the extra LF
lex->chr2 = lex->reader.readbyte(lex->reader.data);
}
}
if (lex->chr2 == MP_LEXER_EOF) {
// EOF, check if we need to insert a newline at end of file
if (lex->chr1 != MP_LEXER_EOF && lex->chr1 != '\n') {
// if lex->chr1 == '\r' then this makes a CR LF which will be converted to LF above
// otherwise it just inserts a LF
// check if we need to insert a newline at end of file
if (lex->chr2 == MP_LEXER_EOF && lex->chr1 != MP_LEXER_EOF && lex->chr1 != '\n') {
lex->chr2 = '\n';
}
}
}
STATIC void indent_push(mp_lexer_t *lex, size_t indent) {