|
1 | 1 | (******************************************************************************)
|
2 | 2 | (* upascallexer 19.04.2023 *)
|
3 | 3 | (* *)
|
4 |
| -(* Version : 0.04 *) |
| 4 | +(* Version : 0.05 *) |
5 | 5 | (* *)
|
6 | 6 | (* Author : Uwe Schächterle (Corpsman) *)
|
7 | 7 | (* *)
|
|
26 | 26 | (* 0.02 - Add Total Line Counter, Empty Line Counter *)
|
27 | 27 | (* 0.03 - Start with unittests, fix "invalid" ( * Parsing *)
|
28 | 28 | (* 0.04 - Berücksichtigen von {$I ...} *)
|
| 29 | +(* 0.05 - Fix Linecounting von {$I ...} *) |
29 | 30 | (* *)
|
30 | 31 | (******************************************************************************)
|
31 | 32 | Unit upascallexer;
|
|
52 | 53 |
|
53 | 54 | TToken = Record
|
54 | 55 | Value: String;
|
55 |
| - Line: integer; |
| 56 | + Line: integer; // Die Zeile in der Datei (Alles was via {$I ...} inkludiert wird, landet in der selben Zeile in der das {$I ...} steht |
56 | 57 | Kind: TTokenKind;
|
57 | 58 | End;
|
58 | 59 |
|
|
65 | 66 | private
|
66 | 67 | aToken: String;
|
67 | 68 | aLine: Integer;
|
| 69 | + aParsedLine: Integer; |
68 | 70 | aEmptyLine: integer;
|
69 | 71 | Procedure HandleToken();
|
70 | 72 | Procedure DoLex(Const Stream: TStream);
|
|
73 | 75 |
|
74 | 76 | OnHandleToken: TOnHandleToken;
|
75 | 77 |
|
76 |
| - Property TotalLineCount: integer read aLine; |
| 78 | + Property TotalFileLineCount: integer read aLine; // Anzahl an Zeilen innerhalb der Datei |
| 79 | + Property TotalParsedLineCount: integer read aParsedLine; // Tatsächliche Anzahl an geparsten Zeilen (wenn die Datei ein {$I ...} token hat, dann unterscheiden sich die beiden Line counts) |
77 | 80 | Property EmptyLineCount: integer read aEmptyLine;
|
78 | 81 |
|
79 | 82 | Constructor Create(); virtual;
|
|
353 | 356 |
|
354 | 357 | Procedure TPascalLexer.DoLex(Const Stream: TStream);
|
355 | 358 |
|
356 |
| - Procedure HToken()Inline; |
| 359 | +Var |
| 360 | + BlockLineCounting: Boolean; // Wenn True, dann werden die ZeilenNummern nicht "Erhöht" wenn CRT gelesen wird. |
| 361 | + |
| 362 | + Procedure HToken(); //Inline; |
357 | 363 | Begin
|
| 364 | + If atoken = '~DisableLineCounter~' Then Begin |
| 365 | + BlockLineCounting := true; |
| 366 | + atoken := ''; |
| 367 | + exit; |
| 368 | + End; |
| 369 | + If atoken = '~EnableLineCounter~' Then Begin |
| 370 | + BlockLineCounting := false; |
| 371 | + atoken := ''; |
| 372 | + exit; |
| 373 | + End; |
358 | 374 | If atoken <> '' Then Begin // Der Token vor dem ersten erkannten Token ist in der Regel leer -> Raus werfen.
|
359 | 375 | HandleToken();
|
360 | 376 | aToken := '';
|
|
388 | 404 | i, mSize: Int64;
|
389 | 405 | Begin
|
390 | 406 | aToken := '';
|
| 407 | + BlockLineCounting := false; |
391 | 408 | State := sCollectToken;
|
392 | 409 | CommentDetphCounter := 0;
|
393 | 410 | pc := #0;
|
394 | 411 | c := #0;
|
395 | 412 | aLine := 1; // Textdateien sind 1 Basiert
|
| 413 | + aParsedLine := 1; |
396 | 414 | aEmptyLine := 0;
|
397 | 415 | i := 0;
|
398 | 416 | mSize := Stream.Size;
|
|
653 | 671 | If (c = lb) And ((pc = lb) Or ((ppc = lb) And (pc In [#10, #13]))) Then Begin
|
654 | 672 | inc(aEmptyLine);
|
655 | 673 | End;
|
656 |
| - If c = LB Then Begin |
657 |
| - inc(aLine); |
| 674 | + If (c = LB) Then Begin |
| 675 | + If (Not BlockLineCounting) Then Begin |
| 676 | + inc(aLine); |
| 677 | + End; |
| 678 | + inc(aParsedLine); |
658 | 679 | End;
|
659 | 680 | inc(i);
|
660 | 681 | End;
|
|
673 | 694 | m: TMemoryStream;
|
674 | 695 | sl2, sl: TStringList;
|
675 | 696 | i: integer;
|
676 |
| - s: String; |
| 697 | + s, t: String; |
677 | 698 | Begin
|
678 | 699 | sl := TStringList.Create;
|
679 | 700 | Try
|
|
684 | 705 | If pos('{$I ', sl[i]) <> 0 Then Begin
|
685 | 706 | s := sl[i];
|
686 | 707 | s := copy(s, pos('{$I ', s) + 4, length(s));
|
| 708 | + t := copy(s, pos('}', s) + 1, length(s)); // Retten dessen was nach dem Include kommt. |
687 | 709 | s := copy(s, 1, pos('}', s) - 1);
|
688 | 710 | s := trim(s);
|
689 | 711 | s := OnResolveFileRequest(self, s);
|
690 | 712 | If s <> '' Then Begin
|
691 | 713 | sl2 := TStringList.Create;
|
692 | 714 | sl2.LoadFromFile(s);
|
693 |
| - sl[i] := sl2.Text; // TODO: das funktioniert nur, wenn in der Zeile sonst nichts anderes Steht |
| 715 | + sl[i] := ' ~DisableLineCounter~ ' + sl2.Text + ' ~EnableLineCounter~ ' + t; |
694 | 716 | sl2.free;
|
695 | 717 | End;
|
696 | 718 | End;
|
|
0 commit comments