aboutsummaryrefslogtreecommitdiffstats
path: root/cparser/Parser.vy
diff options
context:
space:
mode:
authorXavier Leroy <xavier.leroy@college-de-france.fr>2022-05-02 17:31:35 +0200
committerXavier Leroy <xavier.leroy@college-de-france.fr>2022-05-13 11:21:18 +0200
commite44143ad023400c7a8193b7e9fc3b62b9f9614e1 (patch)
treee887f1fac6525441ab4ebdb9de56aa3525eeea0d /cparser/Parser.vy
parent1d572b330362711c808094333134ba94fcd7b768 (diff)
downloadcompcert-e44143ad023400c7a8193b7e9fc3b62b9f9614e1.tar.gz
compcert-e44143ad023400c7a8193b7e9fc3b62b9f9614e1.zip
Support _Generic from ISO C 2011
Entirely handled during elaboration. No impact on the verified part of CompCert.
Diffstat (limited to 'cparser/Parser.vy')
-rw-r--r--cparser/Parser.vy26
1 files changed, 24 insertions, 2 deletions
diff --git a/cparser/Parser.vy b/cparser/Parser.vy
index d489d339..8d7cd055 100644
--- a/cparser/Parser.vy
+++ b/cparser/Parser.vy
@@ -27,7 +27,7 @@ Require Cabs.
%token<Cabs.constant * Cabs.loc> CONSTANT
%token<Cabs.loc> SIZEOF PTR INC DEC LEFT RIGHT LEQ GEQ EQEQ EQ NEQ LT GT
ANDAND BARBAR PLUS MINUS STAR TILDE BANG SLASH PERCENT HAT BAR QUESTION
- COLON AND ALIGNOF
+ COLON AND ALIGNOF GENERIC
%token<Cabs.loc> MUL_ASSIGN DIV_ASSIGN MOD_ASSIGN ADD_ASSIGN SUB_ASSIGN
LEFT_ASSIGN RIGHT_ASSIGN AND_ASSIGN XOR_ASSIGN OR_ASSIGN
@@ -47,7 +47,9 @@ Require Cabs.
shift_expression relational_expression equality_expression AND_expression
exclusive_OR_expression inclusive_OR_expression logical_AND_expression
logical_OR_expression conditional_expression assignment_expression
- constant_expression expression
+ constant_expression expression generic_selection
+%type<list Cabs.generic_assoc> (* Reverse order *) generic_assoc_list
+%type<Cabs.generic_assoc> generic_association
%type<Cabs.unary_operator * Cabs.loc> unary_operator
%type<Cabs.binary_operator> assignment_operator
%type<list Cabs.expression (* Reverse order *)> argument_expression_list
@@ -126,6 +128,26 @@ primary_expression:
(Cabs.CONSTANT (Cabs.CONST_STRING wide chars), loc) }
| loc = LPAREN expr = expression RPAREN
{ (fst expr, loc)}
+| sel = generic_selection
+ { sel }
+
+(* 6.5.1.1 *)
+generic_selection:
+| loc = GENERIC LPAREN expr = assignment_expression COMMA
+ alist = generic_assoc_list RPAREN
+ { (Cabs.GENERIC (fst expr) (rev' alist), loc) }
+
+generic_assoc_list:
+| a = generic_association
+ { [a] }
+| l = generic_assoc_list COMMA a = generic_association
+ { a :: l }
+
+generic_association:
+| tname = type_name COLON expr = assignment_expression
+ { (Some tname, fst expr) }
+| DEFAULT COLON expr = assignment_expression
+ { (None, fst expr) }
(* 6.5.2 *)
postfix_expression: