# HG changeset patch # User aziz # Date 1182798243 0 # Node ID cf3047cf3cd2eaf68a333f02c0c8fe09c98b22ce # Parent d7011daa47408de3eb409f05dc9c7c0cde607482 - Added code for parsing back quote and raw strings. - Made F lower-case in scanPostFix(). - Added more operators to be output in tags. diff -r d7011daa4740 -r cf3047cf3cd2 trunk/src/Lexer.d --- a/trunk/src/Lexer.d Mon Jun 25 17:45:02 2007 +0000 +++ b/trunk/src/Lexer.d Mon Jun 25 19:04:03 2007 +0000 @@ -105,8 +105,10 @@ UnterminatedHexString, // /* */ /+ +/ UnterminatedBlockComment, - UnterminatedNestedComment - + UnterminatedNestedComment, + // `` r"" + UnterminatedRawString, + UnterminatedBackQuoteString, } string[] messages = [ @@ -122,8 +124,10 @@ "unterminated hex string.", // /* */ /+ +/ "unterminated block comment (/* */).", - "unterminated nested comment (/+ +/)." - + "unterminated nested comment (/+ +/).", + // `` r"" + "unterminated raw string.", + "unterminated back quote string.", ]; class Problem @@ -215,7 +219,7 @@ if (isidbeg(c)) { - if (c == 'r' && p[1] == '"') + if (c == 'r' && p[1] == '"' && ++p) return scanRawStringLiteral(t); if (c == 'x' && p[1] == '"') return scanHexStringLiteral(t); @@ -381,6 +385,9 @@ if (c == '\'') return scanCharacterLiteral(t); + if (c == '`') + return scanRawStringLiteral(t); + switch(c) { case '.': @@ -573,7 +580,7 @@ t.end = p; } - char scanPostFix() + char scanPostfix() { switch (*p) { @@ -588,7 +595,56 @@ void scanRawStringLiteral(ref Token t) { - + uint delim = *p; + assert(delim == '`' || delim == '"' && p[-1] == 'r'); + t.type = TOK.String; + char[] buffer; + uint c; + while (1) + { + c = *++p; + switch (c) + { + case '\r': + if (p[1] == '\n') + ++p; + c = '\n'; // Convert '\r' and '\r\n' to '\n' + case '\n': + ++loc; + continue; + case '`': + case '"': + if (c == delim) + { + ++p; + t.pf = scanPostfix(); + Lreturn: + t.str = buffer ~ '\0'; + t.end = p; + return; + } + break; + case LS[0]: + if (p[1] == LS[1] && (p[2] == LS[2] || p[2] == PS[2])) + { + // TODO: convert LS or PS to \n? + buffer ~= p[0..3]; + p += 2; + ++loc; + continue; + } + break; + case 0, _Z_: + if (delim == 'r') + error(MID.UnterminatedRawString); + else + error(MID.UnterminatedBackQuoteString); + goto Lreturn; + default: + } + buffer ~= c; // copy character to buffer + } + assert(0); } void scanHexStringLiteral(ref Token t) @@ -615,7 +671,7 @@ error(mid); } t.str = cast(string) buffer; - t.pf = scanPostFix(); + t.pf = scanPostfix(); t.end = p; return; case '\r': @@ -784,3 +840,4 @@ return tokens; } } +`fdfdfg \ No newline at end of file diff -r d7011daa4740 -r cf3047cf3cd2 trunk/src/format.css --- a/trunk/src/format.css Mon Jun 25 17:45:02 2007 +0000 +++ b/trunk/src/format.css Mon Jun 25 19:04:03 2007 +0000 @@ -9,5 +9,5 @@ i { color: darkblue; } sl { color: red; } cl { color: purple; } -op { color: orange; } +op { color: royalblue; } br { color: orange; } diff -r d7011daa4740 -r cf3047cf3cd2 trunk/src/main.d --- a/trunk/src/main.d Mon Jun 25 17:45:02 2007 +0000 +++ b/trunk/src/main.d Mon Jun 25 19:04:03 2007 +0000 @@ -52,7 +52,16 @@ case TOK.Character: writef("%s", span); break; - case TOK.DivAssign: + case TOK.Assign, TOK.Equal, + TOK.OrAssign, TOK.OrBinary, + TOK.AndAssign, TOK.AndBinary, + TOK.PlusAssign, TOK.PlusPlus, TOK.Plus, + TOK.MinusAssign, TOK.MinusMinus, TOK.Minus, + TOK.DivAssign, TOK.Div, + TOK.MulAssign, TOK.Mul, + TOK.ModAssign, TOK.Mod, + TOK.XorAssign, TOK.Xor, + TOK.CatAssign, TOK.Catenate: writef("%s", span); break; case TOK.AndLogical: