added code to read cdr

This commit is contained in:
hyung-hwan 2014-01-08 07:18:14 +00:00
parent 73c29ce53b
commit c7868449f7

View File

@ -48,7 +48,7 @@ package body H2.Scheme is
subtype Moved_Object_Record is Object_Record (Moved_Object, 0); subtype Moved_Object_Record is Object_Record (Moved_Object, 0);
subtype Opcode_Type is Object_Integer range 0 .. 8; subtype Opcode_Type is Object_Integer range 0 .. 10;
Opcode_Exit: constant Opcode_Type := Opcode_Type'(0); Opcode_Exit: constant Opcode_Type := Opcode_Type'(0);
Opcode_Evaluate_Object: constant Opcode_Type := Opcode_Type'(1); Opcode_Evaluate_Object: constant Opcode_Type := Opcode_Type'(1);
Opcode_Evaluate_Group: constant Opcode_Type := Opcode_Type'(2); -- (begin ...) and closure apply Opcode_Evaluate_Group: constant Opcode_Type := Opcode_Type'(2); -- (begin ...) and closure apply
@ -57,7 +57,9 @@ package body H2.Scheme is
Opcode_Apply: constant Opcode_Type := Opcode_Type'(5); Opcode_Apply: constant Opcode_Type := Opcode_Type'(5);
Opcode_Read_Object: constant Opcode_Type := Opcode_Type'(6); Opcode_Read_Object: constant Opcode_Type := Opcode_Type'(6);
Opcode_Read_List: constant Opcode_Type := Opcode_Type'(7); Opcode_Read_List: constant Opcode_Type := Opcode_Type'(7);
Opcode_Close_List: constant Opcode_Type := Opcode_Type'(8); Opcode_Read_List_Cdr: constant Opcode_Type := Opcode_Type'(8);
Opcode_Read_List_End: constant Opcode_Type := Opcode_Type'(9);
Opcode_Close_List: constant Opcode_Type := Opcode_Type'(10);
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
-- COMMON OBJECTS -- COMMON OBJECTS
@ -867,7 +869,8 @@ Text_IO.Put_Line (">>> [GC DONE]");
end Set_Cdr; end Set_Cdr;
function Reverse_Cons (Source: in Object_Pointer) return Object_Pointer is function Reverse_Cons (Source: in Object_Pointer;
Last_Cdr: in Object_Pointer := Nil_Pointer) return Object_Pointer is
pragma Assert (Is_Cons(Source)); pragma Assert (Is_Cons(Source));
-- Note: The non-nil cdr in the last cons cell gets lost. -- Note: The non-nil cdr in the last cons cell gets lost.
@ -876,7 +879,8 @@ Text_IO.Put_Line (">>> [GC DONE]");
Next: Object_Pointer; Next: Object_Pointer;
Prev: Object_Pointer; Prev: Object_Pointer;
begin begin
Prev := Nil_Pointer; --Prev := Nil_Pointer;
Prev := Last_Cdr;
Ptr := Source; Ptr := Source;
loop loop
Next := Get_Cdr(Ptr); Next := Get_Cdr(Ptr);
@ -2573,9 +2577,12 @@ Text_IO.Put_Line (">>>>>>>>>>>>>>>>>>>>>>> Token: " & Interp.Token.Value.Ptr(1..
procedure Read_List is procedure Read_List is
V: Object_Pointer; V: Object_Pointer;
Period: Standard.Boolean := Standard.False;
begin begin
<<Start_Over>> -- This procedure reads each token in a list.
-- If the list contains no period, this procedure reads up to the
-- closing right paranthesis; If a period is contained, it transfers
-- the control over to Read_List_Cdr.
Fetch_Token; Fetch_Token;
case Interp.Token.Kind is case Interp.Token.Kind is
@ -2600,26 +2607,18 @@ Ada.Text_IO.Put_Line ("ERROR: PREMATURE LIST END");
-- . immediately after ( -- . immediately after (
raise Syntax_Error; raise Syntax_Error;
else else
Period := Standard.True; Set_Frame_Opcode (Interp.Stack, Opcode_Read_List_Cdr);
goto Start_Over;
end if; end if;
when String_Token => when String_Token =>
V := Make_String (Interp.Self, Interp.Token.Value.Ptr.all(1..Interp.Token.Value.Last)); V := Make_String (Interp.Self, Interp.Token.Value.Ptr.all(1..Interp.Token.Value.Last));
-- TODO: make V gc-aware -- TODO: make V gc-aware
if Period then
else
Chain_Frame_Return (Interp, Interp.Stack, V); Chain_Frame_Return (Interp, Interp.Stack, V);
end if;
when Identifier_Token => when Identifier_Token =>
V := Make_Symbol (Interp.Self, Interp.Token.Value.Ptr.all(1..Interp.Token.Value.Last)); V := Make_Symbol (Interp.Self, Interp.Token.Value.Ptr.all(1..Interp.Token.Value.Last));
-- TODO: make V gc-aware -- TODO: make V gc-aware
if Period then
else
Chain_Frame_Return (Interp, Interp.Stack, V); Chain_Frame_Return (Interp, Interp.Stack, V);
end if
when others => when others =>
-- TODO: set various error info -- TODO: set various error info
@ -2627,6 +2626,64 @@ Ada.Text_IO.Put_Line ("ERROR: PREMATURE LIST END");
end case; end case;
end Read_List; end Read_List;
procedure Read_List_Cdr is
V: Object_Pointer;
begin
-- This procedure reads the first token after a period has been read.
-- It transfers the control over to Read_List_End once it has read
-- and processed the token. It chains the value made of the token
-- to the front of the frame's return value list expecting Read_List_End
-- to handle the first item specially.
Fetch_Token;
case Interp.Token.Kind is
when End_Token =>
Ada.Text_IO.Put_Line ("ERROR: PREMATURE LIST END");
raise Syntax_Error;
when Left_Parenthesis_Token =>
Set_Frame_Opcode (Interp.Stack, Opcode_Read_List_End);
Push_Frame (Interp, Opcode_Read_List, Nil_Pointer);
when String_Token =>
V := Make_String (Interp.Self, Interp.Token.Value.Ptr.all(1..Interp.Token.Value.Last));
-- TODO: make V gc-aware
Set_Frame_Opcode (Interp.Stack, Opcode_Read_List_End);
Chain_Frame_Return (Interp, Interp.Stack, V);
when Identifier_Token =>
V := Make_Symbol (Interp.Self, Interp.Token.Value.Ptr.all(1..Interp.Token.Value.Last));
-- TODO: make V gc-aware
Set_Frame_Opcode (Interp.Stack, Opcode_Read_List_End);
Chain_Frame_Return (Interp, Interp.Stack, V);
when others =>
-- TODO: set various error info
raise Syntax_Error;
end case;
end Read_List_Cdr;
procedure Read_List_End is
V: Object_Pointer;
A: Object_Pointer;
begin
Fetch_Token;
case Interp.Token.Kind is
when Right_Parenthesis_Token =>
V := Get_Frame_Return(Interp.Stack);
pragma Assert (V /= Nil_Pointer);
-- The first item in the chain is actually Cdr of the last cell.
V := Reverse_Cons(Get_Cdr(V), Get_Car(V)); -- TODO: GC
Pop_Frame (Interp);
Chain_Frame_Return (Interp, Interp.Stack, V);
when others =>
raise Syntax_Error;
end case;
end Read_List_End;
procedure Close_List is procedure Close_List is
V: Object_Pointer; V: Object_Pointer;
begin begin
@ -2758,8 +2815,15 @@ Ada.Text_IO.Put_Line ("INFO: NO MORE TOKEN ");
when Opcode_Read_List => when Opcode_Read_List =>
Read_List; Read_List;
when Opcode_Read_List_Cdr =>
Read_List_Cdr;
when Opcode_Read_List_End =>
Read_List_End;
when Opcode_Close_List => when Opcode_Close_List =>
Close_List; Close_List;
end case; end case;
end loop; end loop;