aboutsummaryrefslogtreecommitdiffstats
path: root/src/vhdl
diff options
context:
space:
mode:
authorTristan Gingold <tgingold@free.fr>2021-04-05 09:37:19 +0200
committerTristan Gingold <tgingold@free.fr>2021-04-05 10:47:40 +0200
commit88497515714305117625f50ec412c8479e79c243 (patch)
tree266bbd0244a236a1825b8013c77c562cc38972d4 /src/vhdl
parent3c9c6023c38ed1272634a7d2aed5dbe1c318842a (diff)
downloadghdl-88497515714305117625f50ec412c8479e79c243.tar.gz
ghdl-88497515714305117625f50ec412c8479e79c243.tar.bz2
ghdl-88497515714305117625f50ec412c8479e79c243.zip
vhdl-parse_psl.adb: handle parenthesis boolean prefixes. For #1708
Diffstat (limited to 'src/vhdl')
-rw-r--r--src/vhdl/vhdl-parse_psl.adb91
1 files changed, 62 insertions, 29 deletions
diff --git a/src/vhdl/vhdl-parse_psl.adb b/src/vhdl/vhdl-parse_psl.adb
index b7d6c1df4..314249c14 100644
--- a/src/vhdl/vhdl-parse_psl.adb
+++ b/src/vhdl/vhdl-parse_psl.adb
@@ -437,6 +437,59 @@ package body Vhdl.Parse_Psl is
return Res;
end Parse_Brack_Arrow;
+ -- Parse:
+ -- Boolean [= Count ]
+ -- | Boolean [-> [ positive_Count ] ]
+ -- | Boolean
+ -- Where LEFT is the boolean expression
+ function Parse_Boolean_Repeated_Sequence (Left : Node) return Node is
+ begin
+ case Current_Token is
+ when Tok_Brack_Equal =>
+ return Parse_Brack_Equal (Left);
+ when Tok_Brack_Arrow =>
+ return Parse_Brack_Arrow (Left);
+ when others =>
+ return Left;
+ end case;
+ end Parse_Boolean_Repeated_Sequence;
+
+ -- Parse:
+ -- Boolean [* [ Count ] ]
+ -- | Sequence [* [ Count ] ]
+ -- | Boolean [+]
+ -- | Sequence [+]
+ -- Where LEFT is a boolean expression or a sequence
+ function Parse_Sequence_Repeated_Sequence (Left : Node) return Node
+ is
+ Res : Node;
+ N : Node;
+ begin
+ Res := Left;
+ loop
+ case Current_Token is
+ when Tok_Brack_Star =>
+ Res := Parse_Brack_Star (Res);
+ when Tok_Brack_Plus_Brack =>
+ N := Create_Node_Loc (N_Plus_Repeat_Seq);
+ Set_Sequence (N, Res);
+
+ -- Skip '[+]'
+ Scan;
+ Res := N;
+ when Tok_Brack_Arrow =>
+ Error_Msg_Parse ("'[->' not allowed on a SERE");
+ Res := Parse_Brack_Arrow (Res);
+ when Tok_Brack_Equal =>
+ Error_Msg_Parse ("'[=' not allowed on a SERE");
+ Res := Parse_Brack_Equal (Res);
+ when others =>
+ exit;
+ end case;
+ end loop;
+ return Res;
+ end Parse_Sequence_Repeated_Sequence;
+
function Parse_Psl_Sequence_Or_SERE (Full_Hdl_Expr : Boolean) return Node
is
Res, N : Node;
@@ -484,36 +537,10 @@ package body Vhdl.Parse_Psl is
-- Repeated_SERE
Res := Parse_Unary_Boolean (Full_Hdl_Expr);
- case Current_Token is
- when Tok_Brack_Equal =>
- Res := Parse_Brack_Equal (Res);
- when Tok_Brack_Arrow =>
- Res := Parse_Brack_Arrow (Res);
- when others =>
- null;
- end case;
+ Res := Parse_Boolean_Repeated_Sequence (Res);
end case;
- loop
- case Current_Token is
- when Tok_Brack_Star =>
- Res := Parse_Brack_Star (Res);
- when Tok_Brack_Plus_Brack =>
- N := Create_Node_Loc (N_Plus_Repeat_Seq);
- Set_Sequence (N, Res);
- -- Skip '[+]'
- Scan;
- Res := N;
- when Tok_Brack_Arrow =>
- Error_Msg_Parse ("'[->' not allowed on a SERE");
- Res := Parse_Brack_Arrow (Res);
- when Tok_Brack_Equal =>
- Error_Msg_Parse ("'[=' not allowed on a SERE");
- Res := Parse_Brack_Equal (Res);
- when others =>
- exit;
- end case;
- end loop;
+ Res := Parse_Sequence_Repeated_Sequence (Res);
return Res;
end Parse_Psl_Sequence_Or_SERE;
@@ -681,7 +708,13 @@ package body Vhdl.Parse_Psl is
when Tok_Next_Event_E_Em =>
Res := Parse_Boolean_Range_Property (N_Next_Event_E, True);
when Tok_Left_Paren =>
- return Parse_Parenthesis_FL_Property;
+ Res := Parse_Parenthesis_FL_Property;
+ if Get_Kind (Res) = N_HDL_Expr then
+ -- Might be a boolean expression followed by a SERE repeatition
+ Res := Parse_Boolean_Repeated_Sequence (Res);
+ Res := Parse_Sequence_Repeated_Sequence (Res);
+ -- TODO: can be then a SERE (: ; | & && within)
+ end if;
when Tok_Left_Curly =>
Res := Parse_Psl_Sequence_Or_SERE (True);
if Get_Kind (Res) = N_Braced_SERE