Commit 3f61316
authored
Merge pull request #101 from zaskar9/scanner-review
Code Review of Scanner Implementation
### Bug Fixes
- `scanString()`: added EOF guard to prevent infinite loop on unterminated string literals
- `scanString()`: replaced `boost::replace_all`-based `unescape()` with a character-by-character
loop, fixing incorrect handling of sequences such as `\\n` and silent deletion of `\0`
- `escape()`: same rewrite to fix ordering bug where introduced backslashes were doubled
- `scanComment()`: added missing EOF guard in innermost `while (ch_ == '(')` loop
- `scanNumber()`: added `charNo_--` after `seekg` to fix source-position tracking for `..`
### Error Handling
- Replaced all `exit(1)` calls in the scanner with `throw ScannerError()`
- Added `ScannerError` tag-type exception (`struct ScannerError : std::exception`) to `Scanner.h`
- Added `catch (const ScannerError &)` at the top level in `olang/main.cpp` and `utils/grammar/main.cpp`
### API Improvements
- Split `peek(bool advance = false)` into `peek()` and `peekAhead()` for clarity
- Fixed `seek()`: added `file_.clear()`, reset `eof_`, and replaced `ch_ = '\0'` with `read()`; made private
- Changed `path_` from `const path &` (dangling reference risk) to a value type; constructor now takes by value and
moves
### Code Quality
- Removed namespace-level `using` directives from `Scanner.h`; moved required ones to `Scanner.cpp`
- Added `static_cast<unsigned char>` to all `<cctype>` call sites to eliminate undefined behaviour on non-ASCII input
- Dropped `TokenType : char` underlying type in favour of the default `int`
- Changed `EMPTY_POS`, `EMPTY_LOC`, and `to_string` templates in `global.h` from `static` to `inline`
- Fixed missing `const` on `UndefinedToken::value()`
### Documentation
- Added Doxygen-compatible doc comments to all public members of `Scanner.h`
### Tests
- `test/unittests/scanner/UnterminatedString.Mod`: scanner terminates with an error on an unterminated string literal
- `test/unittests/scanner/StringEscape.Mod`: `"\\n"` produces a two-character string, not a newline
- `test/unittests/scanner/StringNullByte.Mod`: `\0` inside a string literal produces an embedded null byte12 files changed
Lines changed: 250 additions & 84 deletions
File tree
- lib
- include
- scanner
- olang
- test/unittests/scanner
- utils/grammar
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
32 | 32 | | |
33 | 33 | | |
34 | 34 | | |
35 | | - | |
36 | | - | |
| 35 | + | |
| 36 | + | |
37 | 37 | | |
38 | 38 | | |
39 | | - | |
| 39 | + | |
40 | 40 | | |
41 | 41 | | |
42 | 42 | | |
43 | 43 | | |
44 | 44 | | |
45 | 45 | | |
46 | | - | |
| 46 | + | |
47 | 47 | | |
48 | 48 | | |
49 | 49 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
11 | 11 | | |
12 | 12 | | |
13 | 13 | | |
| 14 | + | |
14 | 15 | | |
15 | | - | |
16 | | - | |
17 | 16 | | |
18 | | - | |
19 | 17 | | |
| 18 | + | |
| 19 | + | |
20 | 20 | | |
21 | 21 | | |
22 | 22 | | |
23 | 23 | | |
24 | 24 | | |
| 25 | + | |
25 | 26 | | |
| 27 | + | |
| 28 | + | |
26 | 29 | | |
27 | 30 | | |
28 | 31 | | |
29 | 32 | | |
30 | | - | |
31 | | - | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
32 | 37 | | |
33 | 38 | | |
34 | 39 | | |
35 | 40 | | |
36 | | - | |
| 41 | + | |
37 | 42 | | |
38 | 43 | | |
39 | 44 | | |
| |||
66 | 71 | | |
67 | 72 | | |
68 | 73 | | |
69 | | - | |
| 74 | + | |
70 | 75 | | |
71 | 76 | | |
72 | | - | |
73 | 77 | | |
74 | | - | |
75 | | - | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
76 | 83 | | |
77 | | - | |
78 | 84 | | |
79 | | - | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
80 | 88 | | |
81 | 89 | | |
82 | 90 | | |
| |||
89 | 97 | | |
90 | 98 | | |
91 | 99 | | |
| 100 | + | |
92 | 101 | | |
93 | 102 | | |
94 | 103 | | |
95 | 104 | | |
96 | 105 | | |
97 | | - | |
| 106 | + | |
| 107 | + | |
98 | 108 | | |
99 | 109 | | |
100 | 110 | | |
101 | 111 | | |
102 | | - | |
| 112 | + | |
103 | 113 | | |
104 | 114 | | |
105 | 115 | | |
106 | 116 | | |
107 | | - | |
| 117 | + | |
108 | 118 | | |
109 | 119 | | |
110 | | - | |
| 120 | + | |
111 | 121 | | |
112 | 122 | | |
113 | 123 | | |
| |||
168 | 178 | | |
169 | 179 | | |
170 | 180 | | |
171 | | - | |
172 | 181 | | |
173 | 182 | | |
174 | 183 | | |
| |||
230 | 239 | | |
231 | 240 | | |
232 | 241 | | |
233 | | - | |
| 242 | + | |
234 | 243 | | |
235 | 244 | | |
236 | 245 | | |
| |||
249 | 258 | | |
250 | 259 | | |
251 | 260 | | |
252 | | - | |
| 261 | + | |
253 | 262 | | |
| 263 | + | |
| 264 | + | |
| 265 | + | |
| 266 | + | |
254 | 267 | | |
255 | | - | |
| 268 | + | |
256 | 269 | | |
257 | 270 | | |
258 | 271 | | |
| |||
261 | 274 | | |
262 | 275 | | |
263 | 276 | | |
264 | | - | |
| 277 | + | |
265 | 278 | | |
266 | 279 | | |
267 | 280 | | |
| |||
271 | 284 | | |
272 | 285 | | |
273 | 286 | | |
274 | | - | |
| 287 | + | |
275 | 288 | | |
276 | 289 | | |
277 | 290 | | |
| |||
282 | 295 | | |
283 | 296 | | |
284 | 297 | | |
285 | | - | |
| 298 | + | |
286 | 299 | | |
287 | 300 | | |
288 | 301 | | |
| |||
299 | 312 | | |
300 | 313 | | |
301 | 314 | | |
302 | | - | |
| 315 | + | |
| 316 | + | |
303 | 317 | | |
304 | 318 | | |
305 | 319 | | |
306 | 320 | | |
307 | 321 | | |
308 | 322 | | |
309 | 323 | | |
| 324 | + | |
310 | 325 | | |
311 | 326 | | |
312 | 327 | | |
| |||
418 | 433 | | |
419 | 434 | | |
420 | 435 | | |
421 | | - | |
| 436 | + | |
422 | 437 | | |
423 | 438 | | |
424 | 439 | | |
425 | | - | |
| 440 | + | |
| 441 | + | |
| 442 | + | |
426 | 443 | | |
427 | 444 | | |
428 | 445 | | |
| 446 | + | |
| 447 | + | |
| 448 | + | |
| 449 | + | |
429 | 450 | | |
430 | 451 | | |
431 | 452 | | |
| |||
435 | 456 | | |
436 | 457 | | |
437 | 458 | | |
438 | | - | |
439 | | - | |
440 | | - | |
441 | | - | |
442 | | - | |
443 | | - | |
444 | | - | |
445 | | - | |
446 | | - | |
447 | | - | |
448 | | - | |
449 | | - | |
450 | | - | |
451 | | - | |
| 459 | + | |
| 460 | + | |
| 461 | + | |
| 462 | + | |
| 463 | + | |
| 464 | + | |
| 465 | + | |
| 466 | + | |
| 467 | + | |
| 468 | + | |
| 469 | + | |
| 470 | + | |
| 471 | + | |
| 472 | + | |
| 473 | + | |
| 474 | + | |
| 475 | + | |
| 476 | + | |
| 477 | + | |
| 478 | + | |
| 479 | + | |
452 | 480 | | |
453 | 481 | | |
454 | | - | |
455 | | - | |
456 | | - | |
457 | | - | |
458 | | - | |
459 | | - | |
460 | | - | |
461 | | - | |
462 | | - | |
463 | | - | |
464 | | - | |
465 | | - | |
466 | | - | |
467 | | - | |
| 482 | + | |
| 483 | + | |
| 484 | + | |
| 485 | + | |
| 486 | + | |
| 487 | + | |
| 488 | + | |
| 489 | + | |
| 490 | + | |
| 491 | + | |
| 492 | + | |
| 493 | + | |
| 494 | + | |
| 495 | + | |
| 496 | + | |
| 497 | + | |
| 498 | + | |
| 499 | + | |
| 500 | + | |
| 501 | + | |
| 502 | + | |
| 503 | + | |
| 504 | + | |
| 505 | + | |
| 506 | + | |
| 507 | + | |
| 508 | + | |
468 | 509 | | |
0 commit comments