aboutsummaryrefslogtreecommitdiffstats
path: root/src/ortho/oread
diff options
context:
space:
mode:
authorTristan Gingold <tgingold@free.fr>2020-05-27 17:50:12 +0200
committerTristan Gingold <tgingold@free.fr>2020-05-28 17:47:48 +0200
commit691d4875f0710e0603a7ae563600f9a6c041c6d6 (patch)
tree529071dca47189003ebc87cc6e1c6afd5e12b975 /src/ortho/oread
parent58756712b9465c24e1d2a198e5a03aae7ebbf774 (diff)
downloadghdl-691d4875f0710e0603a7ae563600f9a6c041c6d6.tar.gz
ghdl-691d4875f0710e0603a7ae563600f9a6c041c6d6.tar.bz2
ghdl-691d4875f0710e0603a7ae563600f9a6c041c6d6.zip
ortho: add a length parameter to start_array_aggr.
Diffstat (limited to 'src/ortho/oread')
-rw-r--r--src/ortho/oread/ortho_front.adb61
1 files changed, 42 insertions, 19 deletions
diff --git a/src/ortho/oread/ortho_front.adb b/src/ortho/oread/ortho_front.adb
index 42f72ea71..9d2da4192 100644
--- a/src/ortho/oread/ortho_front.adb
+++ b/src/ortho/oread/ortho_front.adb
@@ -2674,31 +2674,54 @@ package body Ortho_Front is
return Res;
end Parse_Constant_Address;
+ function Parse_Array_Aggregate (Aggr_Type : Node_Acc; El_Type : Node_Acc)
+ return O_Cnode
+ is
+ Res : O_Cnode;
+ Constr : O_Array_Aggr_List;
+ Len : Unsigned_32;
+ begin
+ -- Parse '[' LEN ']'
+ Expect (Tok_Left_Brack);
+ Next_Token;
+ Expect (Tok_Num);
+ Len := Unsigned_32 (Token_Number);
+ Next_Token;
+ Expect (Tok_Right_Brack);
+ Next_Token;
+
+ Expect (Tok_Left_Brace);
+ Next_Token;
+ Start_Array_Aggr (Constr, Aggr_Type.Type_Onode, Len);
+ for I in Unsigned_32 loop
+ if Tok = Tok_Right_Brace then
+ if I /= Len then
+ Parse_Error ("bad number of aggregate element");
+ end if;
+ exit;
+ end if;
+
+ if I /= 0 then
+ Expect (Tok_Comma);
+ Next_Token;
+ end if;
+ New_Array_Aggr_El (Constr, Parse_Constant_Value (El_Type));
+ end loop;
+ Finish_Array_Aggr (Constr, Res);
+ Next_Token;
+ return Res;
+ end Parse_Array_Aggregate;
+
function Parse_Constant_Value (Atype : Node_Acc) return O_Cnode
is
Res : O_Cnode;
begin
case Atype.Kind is
when Type_Subarray =>
- declare
- El : constant Node_Acc := Atype.Subarray_Base.Array_Element;
- Constr : O_Array_Aggr_List;
- begin
- Expect (Tok_Left_Brace);
- Next_Token;
- Start_Array_Aggr (Constr, Atype.Type_Onode);
- for I in Natural loop
- exit when Tok = Tok_Right_Brace;
- if I /= 0 then
- Expect (Tok_Comma);
- Next_Token;
- end if;
- New_Array_Aggr_El (Constr, Parse_Constant_Value (El));
- end loop;
- Finish_Array_Aggr (Constr, Res);
- Next_Token;
- return Res;
- end;
+ return Parse_Array_Aggregate
+ (Atype, Atype.Subarray_Base.Array_Element);
+ when Type_Array =>
+ return Parse_Array_Aggregate (Atype, Atype.Array_Element);
when Type_Unsigned
| Type_Signed
| Type_Enum