diff options
author | Xavier Leroy <xavier.leroy@college-de-france.fr> | 2022-05-02 17:31:35 +0200 |
---|---|---|
committer | Xavier Leroy <xavier.leroy@college-de-france.fr> | 2022-05-13 11:21:18 +0200 |
commit | e44143ad023400c7a8193b7e9fc3b62b9f9614e1 (patch) | |
tree | e887f1fac6525441ab4ebdb9de56aa3525eeea0d /cparser/Parser.vy | |
parent | 1d572b330362711c808094333134ba94fcd7b768 (diff) | |
download | compcert-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.vy | 26 |
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: |