commit c5b32c931be8466429af81c16effea3ecea66ba2
parent 4e30b242e98097476132b2b00420109c36fd3544
Author: citbl <citbl@citbl.org>
Date: Sun, 31 May 2026 18:58:23 +1000
make string
Diffstat:
| M | src/lexer.adb | | | 47 | +++++++++++++++++++++++++++++++++++++++++------ |
1 file changed, 41 insertions(+), 6 deletions(-)
diff --git a/src/lexer.adb b/src/lexer.adb
@@ -75,24 +75,59 @@ package body Lexer is
end loop;
end Skip_Spaces_Comments;
+ function Make_String (L : in out Lexer) return Token is
+ C : Character;
+ T : Token;
+ Start : Natural;
+ begin
+ Start := L.Pos;
+ Nudge (L); -- advance `"`
+
+ while true loop
+ C := Peek (L);
+ if C = '"' then
+ exit;
+ end if;
+ Nudge (L);
+ end loop;
+
+ -- Put_Line("made string of " & Integer'Image(L.Pos-Start));
+ -- Put_Line (L.Source (Start .. L.Pos));
+
+ T :=
+ (Kind => Str_Literal,
+ Lexeme => To_Unbounded_String (L.Source (Start .. L.Pos)),
+ Line => 1,
+ Col => 1);
+
+ Nudge (L); -- advance `"`
+ return T;
+ end Make_String;
-- next token
function Next_Token (L : in out Lexer) return Token is
- T : Token;
- TK : Token_Kind;
+ T : Token;
+ TK : Token_Kind;
+ Start : Natural;
+ C : Character;
begin
Skip_Spaces_Comments (L);
+
Put (Peek (L));
if L.Pos < L.Source'Length then
TK := Unknown;
else
TK := EOF;
end if;
+ Start := L.Pos;
+ C := Peek (L);
+ if C = '"' then
+ -- make string
+ T := Make_String (L);
+ return T;
+ end if;
T :=
- (Kind => TK,
- Lexeme => To_Unbounded_String (""),
- Line => 1,
- Col => 1);
+ (Kind => TK, Lexeme => To_Unbounded_String (""), Line => 1, Col => 1);
Nudge (L);
return T;
end Next_Token;