@@ -55,6 +55,34 @@ class NewLexer(origin: Origin, raise: Diagnostic => Unit, dbg: Bool) {
55
55
def takeWhile (i : Int , cur : Ls [Char ] = Nil )(pred : Char => Bool ): (Str , Int ) =
56
56
if (i < length && pred(bytes(i))) takeWhile(i + 1 , bytes(i) :: cur)(pred)
57
57
else (cur.reverseIterator.mkString, i)
58
+
59
+ @ tailrec final
60
+ def str (i : Int , escapeMode : Bool , cur : Ls [Char ] = Nil ): (Str , Int ) =
61
+ if (escapeMode)
62
+ if (i < length)
63
+ bytes(i) match {
64
+ case '"' => str(i + 1 , false , '"' :: cur)
65
+ case 'n' => str(i + 1 , false , '\n ' :: cur)
66
+ case 't' => str(i + 1 , false , '\t ' :: cur)
67
+ case 'r' => str(i + 1 , false , '\r ' :: cur)
68
+ case ch =>
69
+ raise(WarningReport (msg " Found invalid escape character " -> S (loc(i, i + 1 )) :: Nil , source = Lexing ))
70
+ str(i + 1 , false , ch :: cur)
71
+ }
72
+ else {
73
+ raise(ErrorReport (msg " Expect an escape character " -> S (loc(i, i + 1 )) :: Nil , source = Lexing ))
74
+ (cur.reverseIterator.mkString, i)
75
+ }
76
+ else {
77
+ if (i < length)
78
+ bytes(i) match {
79
+ case '\\ ' => str(i + 1 , true , cur)
80
+ case '"' | '\n ' => (cur.reverseIterator.mkString, i)
81
+ case ch => str(i + 1 , false , ch :: cur)
82
+ }
83
+ else
84
+ (cur.reverseIterator.mkString, i)
85
+ }
58
86
59
87
def loc (start : Int , end : Int ): Loc = Loc (start, end, origin)
60
88
@@ -78,7 +106,7 @@ class NewLexer(origin: Origin, raise: Diagnostic => Unit, dbg: Bool) {
78
106
lex(j, ind, next(j, COMMA ))
79
107
case '"' =>
80
108
val j = i + 1
81
- val (chars, k) = takeWhile(j)(c => c =/= '"' && c =/= ' \n ' )
109
+ val (chars, k) = str(j, false )
82
110
val k2 = if (bytes.lift(k) === Some ('"' )) k + 1 else {
83
111
pe(msg " unclosed quotation mark " )
84
112
k
@@ -135,14 +163,19 @@ class NewLexer(origin: Origin, raise: Diagnostic => Unit, dbg: Bool) {
135
163
// go(j, if (keywords.contains(n)) KEYWORD(n) else IDENT(n, isAlphaOp(n)))
136
164
lex(j, ind, next(j, if (keywords.contains(n)) KEYWORD (n) else IDENT (n, isAlphaOp(n))))
137
165
case _ if isOpChar(c) =>
138
- val (n, j) = takeWhile(i)(isOpChar)
139
- if (n === " ." && j < length && isIdentFirstChar(bytes(j))) {
140
- val (name, k) = takeWhile(j)(isIdentChar)
141
- // go(k, SELECT(name))
142
- lex(k, ind, next(k, SELECT (name)))
166
+ if (c === '-' && isDigit(bytes(i + 1 ))) {
167
+ val (str, j) = takeWhile(i + 1 )(isDigit)
168
+ lex(j, ind, next(j, LITVAL (IntLit (- BigInt (str)))))
169
+ } else {
170
+ val (n, j) = takeWhile(i)(isOpChar)
171
+ if (n === " ." && j < length && isIdentFirstChar(bytes(j))) {
172
+ val (name, k) = takeWhile(j)(isIdentChar)
173
+ // go(k, SELECT(name))
174
+ lex(k, ind, next(k, SELECT (name)))
175
+ }
176
+ // else go(j, if (isSymKeyword.contains(n)) KEYWORD(n) else IDENT(n, true))
177
+ else lex(j, ind, next(j, if (isSymKeyword.contains(n)) KEYWORD (n) else IDENT (n, true )))
143
178
}
144
- // else go(j, if (isSymKeyword.contains(n)) KEYWORD(n) else IDENT(n, true))
145
- else lex(j, ind, next(j, if (isSymKeyword.contains(n)) KEYWORD (n) else IDENT (n, true )))
146
179
case _ if isDigit(c) =>
147
180
val (str, j) = takeWhile(i)(isDigit)
148
181
// go(j, LITVAL(IntLit(BigInt(str))))
0 commit comments