aboutsummaryrefslogtreecommitdiffstats
path: root/cparser/Parser.vy
diff options
context:
space:
mode:
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: