17c478bd9Sstevel@tonic-gate %{
27c478bd9Sstevel@tonic-gate /*
37c478bd9Sstevel@tonic-gate  * CDDL HEADER START
47c478bd9Sstevel@tonic-gate  *
57c478bd9Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
67c478bd9Sstevel@tonic-gate  * Common Development and Distribution License, Version 1.0 only
77c478bd9Sstevel@tonic-gate  * (the "License").  You may not use this file except in compliance
87c478bd9Sstevel@tonic-gate  * with the License.
97c478bd9Sstevel@tonic-gate  *
107c478bd9Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
117c478bd9Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
127c478bd9Sstevel@tonic-gate  * See the License for the specific language governing permissions
137c478bd9Sstevel@tonic-gate  * and limitations under the License.
147c478bd9Sstevel@tonic-gate  *
157c478bd9Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
167c478bd9Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
177c478bd9Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
187c478bd9Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
197c478bd9Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
207c478bd9Sstevel@tonic-gate  *
217c478bd9Sstevel@tonic-gate  * CDDL HEADER END
227c478bd9Sstevel@tonic-gate  *
23e4586ebfSmws  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
247c478bd9Sstevel@tonic-gate  * Use is subject to license terms.
257c478bd9Sstevel@tonic-gate  */
26c3bd3abdSMatthew Ahrens 
27a386cc11SRobert Mustacchi /*
28c3bd3abdSMatthew Ahrens  * Copyright (c) 2014, 2016 by Delphix. All rights reserved.
29a386cc11SRobert Mustacchi  * Copyright (c) 2013, Joyent, Inc. All rights reserved.
30a386cc11SRobert Mustacchi  */
317c478bd9Sstevel@tonic-gate 
327c478bd9Sstevel@tonic-gate #include <dt_impl.h>
337c478bd9Sstevel@tonic-gate 
347c478bd9Sstevel@tonic-gate #define	OP1(op, c)	dt_node_op1(op, c)
357c478bd9Sstevel@tonic-gate #define	OP2(op, l, r)	dt_node_op2(op, l, r)
367c478bd9Sstevel@tonic-gate #define	OP3(x, y, z)	dt_node_op3(x, y, z)
377c478bd9Sstevel@tonic-gate #define	LINK(l, r)	dt_node_link(l, r)
387c478bd9Sstevel@tonic-gate #define	DUP(s)		strdup(s)
397c478bd9Sstevel@tonic-gate 
407c478bd9Sstevel@tonic-gate %}
417c478bd9Sstevel@tonic-gate 
427c478bd9Sstevel@tonic-gate %union {
437c478bd9Sstevel@tonic-gate 	dt_node_t *l_node;
447c478bd9Sstevel@tonic-gate 	dt_decl_t *l_decl;
457c478bd9Sstevel@tonic-gate 	char *l_str;
467c478bd9Sstevel@tonic-gate 	uintmax_t l_int;
477c478bd9Sstevel@tonic-gate 	int l_tok;
487c478bd9Sstevel@tonic-gate }
497c478bd9Sstevel@tonic-gate 
507c478bd9Sstevel@tonic-gate %token	DT_TOK_COMMA DT_TOK_ELLIPSIS
517c478bd9Sstevel@tonic-gate %token	DT_TOK_ASGN DT_TOK_ADD_EQ DT_TOK_SUB_EQ DT_TOK_MUL_EQ
527c478bd9Sstevel@tonic-gate %token	DT_TOK_DIV_EQ DT_TOK_MOD_EQ DT_TOK_AND_EQ DT_TOK_XOR_EQ DT_TOK_OR_EQ
537c478bd9Sstevel@tonic-gate %token	DT_TOK_LSH_EQ DT_TOK_RSH_EQ DT_TOK_QUESTION DT_TOK_COLON
547c478bd9Sstevel@tonic-gate %token	DT_TOK_LOR DT_TOK_LXOR DT_TOK_LAND
557c478bd9Sstevel@tonic-gate %token	DT_TOK_BOR DT_TOK_XOR DT_TOK_BAND DT_TOK_EQU DT_TOK_NEQ
567c478bd9Sstevel@tonic-gate %token	DT_TOK_LT DT_TOK_LE DT_TOK_GT DT_TOK_GE DT_TOK_LSH DT_TOK_RSH
577c478bd9Sstevel@tonic-gate %token	DT_TOK_ADD DT_TOK_SUB DT_TOK_MUL DT_TOK_DIV DT_TOK_MOD
587c478bd9Sstevel@tonic-gate %token	DT_TOK_LNEG DT_TOK_BNEG DT_TOK_ADDADD DT_TOK_SUBSUB
597c478bd9Sstevel@tonic-gate %token	DT_TOK_PREINC DT_TOK_POSTINC DT_TOK_PREDEC DT_TOK_POSTDEC
607c478bd9Sstevel@tonic-gate %token	DT_TOK_IPOS DT_TOK_INEG DT_TOK_DEREF DT_TOK_ADDROF
617c478bd9Sstevel@tonic-gate %token	DT_TOK_OFFSETOF DT_TOK_SIZEOF DT_TOK_STRINGOF DT_TOK_XLATE
627c478bd9Sstevel@tonic-gate %token	DT_TOK_LPAR DT_TOK_RPAR DT_TOK_LBRAC DT_TOK_RBRAC DT_TOK_PTR DT_TOK_DOT
637c478bd9Sstevel@tonic-gate 
647c478bd9Sstevel@tonic-gate %token <l_str>	DT_TOK_STRING
657c478bd9Sstevel@tonic-gate %token <l_str>	DT_TOK_IDENT
667c478bd9Sstevel@tonic-gate %token <l_str>	DT_TOK_PSPEC
677c478bd9Sstevel@tonic-gate %token <l_str>	DT_TOK_AGG
687c478bd9Sstevel@tonic-gate %token <l_str>	DT_TOK_TNAME
697c478bd9Sstevel@tonic-gate %token <l_int>	DT_TOK_INT
707c478bd9Sstevel@tonic-gate 
717c478bd9Sstevel@tonic-gate %token	DT_KEY_AUTO
727c478bd9Sstevel@tonic-gate %token	DT_KEY_BREAK
737c478bd9Sstevel@tonic-gate %token	DT_KEY_CASE
747c478bd9Sstevel@tonic-gate %token	DT_KEY_CHAR
757c478bd9Sstevel@tonic-gate %token	DT_KEY_CONST
767c478bd9Sstevel@tonic-gate %token	DT_KEY_CONTINUE
777c478bd9Sstevel@tonic-gate %token	DT_KEY_COUNTER
787c478bd9Sstevel@tonic-gate %token	DT_KEY_DEFAULT
797c478bd9Sstevel@tonic-gate %token	DT_KEY_DO
807c478bd9Sstevel@tonic-gate %token	DT_KEY_DOUBLE
817c478bd9Sstevel@tonic-gate %token	DT_KEY_ELSE
827c478bd9Sstevel@tonic-gate %token	DT_KEY_ENUM
837c478bd9Sstevel@tonic-gate %token	DT_KEY_EXTERN
847c478bd9Sstevel@tonic-gate %token	DT_KEY_FLOAT
857c478bd9Sstevel@tonic-gate %token	DT_KEY_FOR
867c478bd9Sstevel@tonic-gate %token	DT_KEY_GOTO
877c478bd9Sstevel@tonic-gate %token	DT_KEY_IF
887c478bd9Sstevel@tonic-gate %token	DT_KEY_IMPORT
897c478bd9Sstevel@tonic-gate %token	DT_KEY_INLINE
907c478bd9Sstevel@tonic-gate %token	DT_KEY_INT
917c478bd9Sstevel@tonic-gate %token	DT_KEY_LONG
927c478bd9Sstevel@tonic-gate %token	DT_KEY_PROBE
937c478bd9Sstevel@tonic-gate %token	DT_KEY_PROVIDER
947c478bd9Sstevel@tonic-gate %token	DT_KEY_REGISTER
957c478bd9Sstevel@tonic-gate %token	DT_KEY_RESTRICT
967c478bd9Sstevel@tonic-gate %token	DT_KEY_RETURN
977c478bd9Sstevel@tonic-gate %token	DT_KEY_SELF
987c478bd9Sstevel@tonic-gate %token	DT_KEY_SHORT
997c478bd9Sstevel@tonic-gate %token	DT_KEY_SIGNED
1007c478bd9Sstevel@tonic-gate %token	DT_KEY_STATIC
1017c478bd9Sstevel@tonic-gate %token	DT_KEY_STRING
1027c478bd9Sstevel@tonic-gate %token	DT_KEY_STRUCT
1037c478bd9Sstevel@tonic-gate %token	DT_KEY_SWITCH
1047c478bd9Sstevel@tonic-gate %token	DT_KEY_THIS
1057c478bd9Sstevel@tonic-gate %token	DT_KEY_TYPEDEF
1067c478bd9Sstevel@tonic-gate %token	DT_KEY_UNION
1077c478bd9Sstevel@tonic-gate %token	DT_KEY_UNSIGNED
108a386cc11SRobert Mustacchi %token	DT_KEY_USERLAND
1097c478bd9Sstevel@tonic-gate %token	DT_KEY_VOID
1107c478bd9Sstevel@tonic-gate %token	DT_KEY_VOLATILE
1117c478bd9Sstevel@tonic-gate %token	DT_KEY_WHILE
1127c478bd9Sstevel@tonic-gate %token	DT_KEY_XLATOR
1137c478bd9Sstevel@tonic-gate 
1147c478bd9Sstevel@tonic-gate %token	DT_TOK_EPRED
1157c478bd9Sstevel@tonic-gate %token	DT_CTX_DEXPR
1167c478bd9Sstevel@tonic-gate %token	DT_CTX_DPROG
1177c478bd9Sstevel@tonic-gate %token	DT_CTX_DTYPE
1187c478bd9Sstevel@tonic-gate %token	DT_TOK_EOF	0
1197c478bd9Sstevel@tonic-gate 
1207c478bd9Sstevel@tonic-gate %left	DT_TOK_COMMA
1217c478bd9Sstevel@tonic-gate %right	DT_TOK_ASGN DT_TOK_ADD_EQ DT_TOK_SUB_EQ DT_TOK_MUL_EQ DT_TOK_DIV_EQ
1227c478bd9Sstevel@tonic-gate 	DT_TOK_MOD_EQ DT_TOK_AND_EQ DT_TOK_XOR_EQ DT_TOK_OR_EQ DT_TOK_LSH_EQ
1237c478bd9Sstevel@tonic-gate 	DT_TOK_RSH_EQ
1247c478bd9Sstevel@tonic-gate %left	DT_TOK_QUESTION DT_TOK_COLON
1257c478bd9Sstevel@tonic-gate %left	DT_TOK_LOR
1267c478bd9Sstevel@tonic-gate %left	DT_TOK_LXOR
1277c478bd9Sstevel@tonic-gate %left	DT_TOK_LAND
1287c478bd9Sstevel@tonic-gate %left	DT_TOK_BOR
1297c478bd9Sstevel@tonic-gate %left	DT_TOK_XOR
1307c478bd9Sstevel@tonic-gate %left	DT_TOK_BAND
1317c478bd9Sstevel@tonic-gate %left	DT_TOK_EQU DT_TOK_NEQ
1327c478bd9Sstevel@tonic-gate %left	DT_TOK_LT DT_TOK_LE DT_TOK_GT DT_TOK_GE
1337c478bd9Sstevel@tonic-gate %left	DT_TOK_LSH DT_TOK_RSH
1347c478bd9Sstevel@tonic-gate %left	DT_TOK_ADD DT_TOK_SUB
1357c478bd9Sstevel@tonic-gate %left	DT_TOK_MUL DT_TOK_DIV DT_TOK_MOD
1367c478bd9Sstevel@tonic-gate %right	DT_TOK_LNEG DT_TOK_BNEG DT_TOK_ADDADD DT_TOK_SUBSUB
1377c478bd9Sstevel@tonic-gate 	DT_TOK_IPOS DT_TOK_INEG
1387c478bd9Sstevel@tonic-gate %right	DT_TOK_DEREF DT_TOK_ADDROF DT_TOK_SIZEOF DT_TOK_STRINGOF DT_TOK_XLATE
1397c478bd9Sstevel@tonic-gate %left	DT_TOK_LPAR DT_TOK_RPAR DT_TOK_LBRAC DT_TOK_RBRAC DT_TOK_PTR DT_TOK_DOT
1407c478bd9Sstevel@tonic-gate 
1417c478bd9Sstevel@tonic-gate %type	<l_node>	d_expression
1427c478bd9Sstevel@tonic-gate %type	<l_node>	d_program
1437c478bd9Sstevel@tonic-gate %type	<l_node>	d_type
1447c478bd9Sstevel@tonic-gate 
1457c478bd9Sstevel@tonic-gate %type	<l_node>	translation_unit
1467c478bd9Sstevel@tonic-gate %type	<l_node>	external_declaration
1477c478bd9Sstevel@tonic-gate %type	<l_node>	inline_definition
1487c478bd9Sstevel@tonic-gate %type	<l_node>	translator_definition
1497c478bd9Sstevel@tonic-gate %type	<l_node>	translator_member_list
1507c478bd9Sstevel@tonic-gate %type	<l_node>	translator_member
1517c478bd9Sstevel@tonic-gate %type	<l_node>	provider_definition
1527c478bd9Sstevel@tonic-gate %type	<l_node>	provider_probe_list
1537c478bd9Sstevel@tonic-gate %type	<l_node>	provider_probe
1547c478bd9Sstevel@tonic-gate %type	<l_node>	probe_definition
1557c478bd9Sstevel@tonic-gate %type	<l_node>	probe_specifiers
1567c478bd9Sstevel@tonic-gate %type	<l_node>	probe_specifier_list
1577c478bd9Sstevel@tonic-gate %type	<l_node>	probe_specifier
1587c478bd9Sstevel@tonic-gate %type	<l_node>	statement_list
159c3bd3abdSMatthew Ahrens %type	<l_node>	statement_list_impl
160c3bd3abdSMatthew Ahrens %type	<l_node>	statement_or_block
1617c478bd9Sstevel@tonic-gate %type	<l_node>	statement
1627c478bd9Sstevel@tonic-gate %type	<l_node>	declaration
1637c478bd9Sstevel@tonic-gate %type	<l_node>	init_declarator_list
1647c478bd9Sstevel@tonic-gate %type	<l_node>	init_declarator
1657c478bd9Sstevel@tonic-gate 
1667c478bd9Sstevel@tonic-gate %type	<l_decl>	type_specifier
1677c478bd9Sstevel@tonic-gate %type	<l_decl>	type_qualifier
1687c478bd9Sstevel@tonic-gate %type	<l_decl>	struct_or_union_specifier
1697c478bd9Sstevel@tonic-gate %type	<l_decl>	specifier_qualifier_list
1707c478bd9Sstevel@tonic-gate %type	<l_decl>	enum_specifier
1717c478bd9Sstevel@tonic-gate %type	<l_decl>	declarator
1727c478bd9Sstevel@tonic-gate %type	<l_decl>	direct_declarator
1737c478bd9Sstevel@tonic-gate %type	<l_decl>	pointer
1747c478bd9Sstevel@tonic-gate %type	<l_decl>	type_qualifier_list
1757c478bd9Sstevel@tonic-gate %type	<l_decl>	type_name
1767c478bd9Sstevel@tonic-gate %type	<l_decl>	abstract_declarator
1777c478bd9Sstevel@tonic-gate %type	<l_decl>	direct_abstract_declarator
1787c478bd9Sstevel@tonic-gate 
1797c478bd9Sstevel@tonic-gate %type	<l_node>	parameter_type_list
1807c478bd9Sstevel@tonic-gate %type	<l_node>	parameter_list
1817c478bd9Sstevel@tonic-gate %type	<l_node>	parameter_declaration
1827c478bd9Sstevel@tonic-gate 
1837c478bd9Sstevel@tonic-gate %type	<l_node>	array
184e4586ebfSmws %type	<l_node>	array_parameters
1857c478bd9Sstevel@tonic-gate %type	<l_node>	function
186e4586ebfSmws %type	<l_node>	function_parameters
1877c478bd9Sstevel@tonic-gate 
1887c478bd9Sstevel@tonic-gate %type	<l_node>	expression
1897c478bd9Sstevel@tonic-gate %type	<l_node>	assignment_expression
1907c478bd9Sstevel@tonic-gate %type	<l_node>	conditional_expression
1917c478bd9Sstevel@tonic-gate %type	<l_node>	constant_expression
1927c478bd9Sstevel@tonic-gate %type	<l_node>	logical_or_expression
1937c478bd9Sstevel@tonic-gate %type	<l_node>	logical_xor_expression
1947c478bd9Sstevel@tonic-gate %type	<l_node>	logical_and_expression
1957c478bd9Sstevel@tonic-gate %type	<l_node>	inclusive_or_expression
1967c478bd9Sstevel@tonic-gate %type	<l_node>	exclusive_or_expression
1977c478bd9Sstevel@tonic-gate %type	<l_node>	and_expression
1987c478bd9Sstevel@tonic-gate %type	<l_node>	equality_expression
1997c478bd9Sstevel@tonic-gate %type	<l_node>	relational_expression
2007c478bd9Sstevel@tonic-gate %type	<l_node>	shift_expression
2017c478bd9Sstevel@tonic-gate %type	<l_node>	additive_expression
2027c478bd9Sstevel@tonic-gate %type	<l_node>	multiplicative_expression
2037c478bd9Sstevel@tonic-gate %type	<l_node>	cast_expression
2047c478bd9Sstevel@tonic-gate %type	<l_node>	unary_expression
2057c478bd9Sstevel@tonic-gate %type	<l_node>	postfix_expression
2067c478bd9Sstevel@tonic-gate %type	<l_node>	primary_expression
2077c478bd9Sstevel@tonic-gate %type	<l_node>	argument_expression_list
2087c478bd9Sstevel@tonic-gate 
2097c478bd9Sstevel@tonic-gate %type	<l_tok>		assignment_operator
2107c478bd9Sstevel@tonic-gate %type	<l_tok>		unary_operator
2117c478bd9Sstevel@tonic-gate %type	<l_tok>		struct_or_union
2127c478bd9Sstevel@tonic-gate 
2137c478bd9Sstevel@tonic-gate %%
2147c478bd9Sstevel@tonic-gate 
2157c478bd9Sstevel@tonic-gate dtrace_program: d_expression DT_TOK_EOF { return (dt_node_root($1)); }
2167c478bd9Sstevel@tonic-gate 	|	d_program DT_TOK_EOF { return (dt_node_root($1)); }
2177c478bd9Sstevel@tonic-gate 	|	d_type DT_TOK_EOF { return (dt_node_root($1)); }
2187c478bd9Sstevel@tonic-gate 	;
2197c478bd9Sstevel@tonic-gate 
2207c478bd9Sstevel@tonic-gate d_expression:	DT_CTX_DEXPR { $$ = NULL; }
2217c478bd9Sstevel@tonic-gate 	|	DT_CTX_DEXPR expression { $$ = $2; }
2227c478bd9Sstevel@tonic-gate 	;
2237c478bd9Sstevel@tonic-gate 
2247c478bd9Sstevel@tonic-gate d_program:	DT_CTX_DPROG { $$ = dt_node_program(NULL); }
2257c478bd9Sstevel@tonic-gate 	|	DT_CTX_DPROG translation_unit { $$ = dt_node_program($2); }
2267c478bd9Sstevel@tonic-gate 	;
2277c478bd9Sstevel@tonic-gate 
2287c478bd9Sstevel@tonic-gate d_type:		DT_CTX_DTYPE { $$ = NULL; }
2297c478bd9Sstevel@tonic-gate 	|	DT_CTX_DTYPE type_name { $$ = (dt_node_t *)$2; }
2307c478bd9Sstevel@tonic-gate 	;
2317c478bd9Sstevel@tonic-gate 
2327c478bd9Sstevel@tonic-gate translation_unit:
2337c478bd9Sstevel@tonic-gate 		external_declaration
2347c478bd9Sstevel@tonic-gate 	|	translation_unit external_declaration { $$ = LINK($1, $2); }
2357c478bd9Sstevel@tonic-gate 	;
2367c478bd9Sstevel@tonic-gate 
2377c478bd9Sstevel@tonic-gate external_declaration:
2387c478bd9Sstevel@tonic-gate 		inline_definition
2397c478bd9Sstevel@tonic-gate 	|	translator_definition
2407c478bd9Sstevel@tonic-gate 	|	provider_definition
2417c478bd9Sstevel@tonic-gate 	|	probe_definition
2427c478bd9Sstevel@tonic-gate 	|	declaration
2437c478bd9Sstevel@tonic-gate 	;
2447c478bd9Sstevel@tonic-gate 
2457c478bd9Sstevel@tonic-gate inline_definition:
2467c478bd9Sstevel@tonic-gate 		DT_KEY_INLINE declaration_specifiers declarator
2477c478bd9Sstevel@tonic-gate 		    { dt_scope_push(NULL, CTF_ERR); } DT_TOK_ASGN
2487c478bd9Sstevel@tonic-gate 		    assignment_expression ';' {
2497c478bd9Sstevel@tonic-gate 			/*
2507c478bd9Sstevel@tonic-gate 			 * We push a new declaration scope before shifting the
2517c478bd9Sstevel@tonic-gate 			 * assignment_expression in order to preserve ds_class
2527c478bd9Sstevel@tonic-gate 			 * and ds_ident for use in dt_node_inline().  Once the
2537c478bd9Sstevel@tonic-gate 			 * entire inline_definition rule is matched, pop the
2547c478bd9Sstevel@tonic-gate 			 * scope and construct the inline using the saved decl.
2557c478bd9Sstevel@tonic-gate 			 */
2567c478bd9Sstevel@tonic-gate 			dt_scope_pop();
2577c478bd9Sstevel@tonic-gate 			$$ = dt_node_inline($6);
2587c478bd9Sstevel@tonic-gate 		}
2597c478bd9Sstevel@tonic-gate 	;
2607c478bd9Sstevel@tonic-gate 
2617c478bd9Sstevel@tonic-gate translator_definition:
2627c478bd9Sstevel@tonic-gate 		DT_KEY_XLATOR type_name DT_TOK_LT type_name
2637c478bd9Sstevel@tonic-gate 		    DT_TOK_IDENT DT_TOK_GT '{' translator_member_list '}' ';' {
2647c478bd9Sstevel@tonic-gate 			$$ = dt_node_xlator($2, $4, $5, $8);
2657c478bd9Sstevel@tonic-gate 		}
2667c478bd9Sstevel@tonic-gate 	|	DT_KEY_XLATOR type_name DT_TOK_LT type_name
2677c478bd9Sstevel@tonic-gate 		    DT_TOK_IDENT DT_TOK_GT '{' '}' ';' {
2687c478bd9Sstevel@tonic-gate 			$$ = dt_node_xlator($2, $4, $5, NULL);
2697c478bd9Sstevel@tonic-gate 		}
2707c478bd9Sstevel@tonic-gate 	;
2717c478bd9Sstevel@tonic-gate 
2727c478bd9Sstevel@tonic-gate translator_member_list:
2737c478bd9Sstevel@tonic-gate 		translator_member
2747c478bd9Sstevel@tonic-gate 	|	translator_member_list translator_member { $$ = LINK($1,$2); }
2757c478bd9Sstevel@tonic-gate 	;
2767c478bd9Sstevel@tonic-gate 
2777c478bd9Sstevel@tonic-gate translator_member:
2787c478bd9Sstevel@tonic-gate 		DT_TOK_IDENT DT_TOK_ASGN assignment_expression ';' {
2797c478bd9Sstevel@tonic-gate 			$$ = dt_node_member(NULL, $1, $3);
2807c478bd9Sstevel@tonic-gate 		}
2817c478bd9Sstevel@tonic-gate 	;
2827c478bd9Sstevel@tonic-gate 
2837c478bd9Sstevel@tonic-gate provider_definition:
2847c478bd9Sstevel@tonic-gate 		DT_KEY_PROVIDER DT_TOK_IDENT '{' provider_probe_list '}' ';' {
2857c478bd9Sstevel@tonic-gate 			$$ = dt_node_provider($2, $4);
2867c478bd9Sstevel@tonic-gate 		}
2877c478bd9Sstevel@tonic-gate 	|	DT_KEY_PROVIDER DT_TOK_IDENT '{' '}' ';' {
2887c478bd9Sstevel@tonic-gate 			$$ = dt_node_provider($2, NULL);
2897c478bd9Sstevel@tonic-gate 		}
2907c478bd9Sstevel@tonic-gate 	;
2917c478bd9Sstevel@tonic-gate 
2927c478bd9Sstevel@tonic-gate provider_probe_list:
2937c478bd9Sstevel@tonic-gate 		provider_probe
2947c478bd9Sstevel@tonic-gate 	|	provider_probe_list provider_probe { $$ = LINK($1, $2); }
2957c478bd9Sstevel@tonic-gate 	;
2967c478bd9Sstevel@tonic-gate 
2977c478bd9Sstevel@tonic-gate provider_probe:
2987c478bd9Sstevel@tonic-gate 		DT_KEY_PROBE DT_TOK_IDENT function DT_TOK_COLON function ';' {
2991a7c1b72Smws 			$$ = dt_node_probe($2, 2, $3, $5);
3007c478bd9Sstevel@tonic-gate 		}
3017c478bd9Sstevel@tonic-gate 	|	DT_KEY_PROBE DT_TOK_IDENT function ';' {
3021a7c1b72Smws 			$$ = dt_node_probe($2, 1, $3, NULL);
3037c478bd9Sstevel@tonic-gate 		}
3047c478bd9Sstevel@tonic-gate 	;
3057c478bd9Sstevel@tonic-gate 
3067c478bd9Sstevel@tonic-gate probe_definition:
3077c478bd9Sstevel@tonic-gate 		probe_specifiers {
3087c478bd9Sstevel@tonic-gate 			/*
3097c478bd9Sstevel@tonic-gate 			 * If the input stream is a file, do not permit a probe
3107c478bd9Sstevel@tonic-gate 			 * specification without / <pred> / or { <act> } after
3117c478bd9Sstevel@tonic-gate 			 * it.  This can only occur if the next token is EOF or
3127c478bd9Sstevel@tonic-gate 			 * an ambiguous predicate was slurped up as a comment.
3137c478bd9Sstevel@tonic-gate 			 * We cannot perform this check if input() is a string
314bbf21555SRichard Lowe 			 * because dtrace(8) [-fmnP] also use the compiler and
3157c478bd9Sstevel@tonic-gate 			 * things like dtrace -n BEGIN have to be accepted.
3167c478bd9Sstevel@tonic-gate 			 */
3177c478bd9Sstevel@tonic-gate 			if (yypcb->pcb_fileptr != NULL) {
3187c478bd9Sstevel@tonic-gate 				dnerror($1, D_SYNTAX, "expected predicate and/"
3197c478bd9Sstevel@tonic-gate 				    "or actions following probe description\n");
3207c478bd9Sstevel@tonic-gate 			}
3217c478bd9Sstevel@tonic-gate 			$$ = dt_node_clause($1, NULL, NULL);
322c3bd3abdSMatthew Ahrens 			yybegin(YYS_CLAUSE);
3237c478bd9Sstevel@tonic-gate 		}
3247c478bd9Sstevel@tonic-gate 	|	probe_specifiers '{' statement_list '}' {
3257c478bd9Sstevel@tonic-gate 			$$ = dt_node_clause($1, NULL, $3);
326c3bd3abdSMatthew Ahrens 			yybegin(YYS_CLAUSE);
3277c478bd9Sstevel@tonic-gate 		}
3287c478bd9Sstevel@tonic-gate 	|	probe_specifiers DT_TOK_DIV expression DT_TOK_EPRED {
3297c478bd9Sstevel@tonic-gate 			dnerror($3, D_SYNTAX, "expected actions { } following "
3307c478bd9Sstevel@tonic-gate 			    "probe description and predicate\n");
3317c478bd9Sstevel@tonic-gate 		}
3327c478bd9Sstevel@tonic-gate 	|	probe_specifiers DT_TOK_DIV expression DT_TOK_EPRED
3337c478bd9Sstevel@tonic-gate 		    '{' statement_list '}' {
3347c478bd9Sstevel@tonic-gate 			$$ = dt_node_clause($1, $3, $6);
335c3bd3abdSMatthew Ahrens 			yybegin(YYS_CLAUSE);
3367c478bd9Sstevel@tonic-gate 		}
3377c478bd9Sstevel@tonic-gate 	;
3387c478bd9Sstevel@tonic-gate 
3397c478bd9Sstevel@tonic-gate probe_specifiers:
3407c478bd9Sstevel@tonic-gate 		probe_specifier_list { yybegin(YYS_EXPR); $$ = $1; }
3417c478bd9Sstevel@tonic-gate 	;
3427c478bd9Sstevel@tonic-gate 
3437c478bd9Sstevel@tonic-gate probe_specifier_list:
3447c478bd9Sstevel@tonic-gate 		probe_specifier
3457c478bd9Sstevel@tonic-gate 	|	probe_specifier_list DT_TOK_COMMA probe_specifier {
3467c478bd9Sstevel@tonic-gate 			$$ = LINK($1, $3);
3477c478bd9Sstevel@tonic-gate 		}
3487c478bd9Sstevel@tonic-gate 	;
3497c478bd9Sstevel@tonic-gate 
3507c478bd9Sstevel@tonic-gate probe_specifier:
3517c478bd9Sstevel@tonic-gate 		DT_TOK_PSPEC { $$ = dt_node_pdesc_by_name($1); }
3527c478bd9Sstevel@tonic-gate 	|	DT_TOK_INT   { $$ = dt_node_pdesc_by_id($1); }
3537c478bd9Sstevel@tonic-gate 	;
3547c478bd9Sstevel@tonic-gate 
355c3bd3abdSMatthew Ahrens statement_list_impl: /* empty */ { $$ = NULL; }
356c3bd3abdSMatthew Ahrens 	|	statement_list_impl statement { $$ = LINK($1, $2); }
357c3bd3abdSMatthew Ahrens 	;
358c3bd3abdSMatthew Ahrens 
359c3bd3abdSMatthew Ahrens statement_list:
360c3bd3abdSMatthew Ahrens 		statement_list_impl { $$ = $1; }
361c3bd3abdSMatthew Ahrens 	|	statement_list_impl expression {
362c3bd3abdSMatthew Ahrens 			$$ = LINK($1, dt_node_statement($2));
363c3bd3abdSMatthew Ahrens 		}
3647c478bd9Sstevel@tonic-gate 	;
3657c478bd9Sstevel@tonic-gate 
366c3bd3abdSMatthew Ahrens statement_or_block:
367c3bd3abdSMatthew Ahrens 		statement
368c3bd3abdSMatthew Ahrens 	|	'{' statement_list '}' { $$ = $2; }
369c3bd3abdSMatthew Ahrens 
370c3bd3abdSMatthew Ahrens statement:	';' { $$ = NULL; }
371c3bd3abdSMatthew Ahrens 	|	expression ';' { $$ = dt_node_statement($1); }
372c3bd3abdSMatthew Ahrens 	|	DT_KEY_IF DT_TOK_LPAR expression DT_TOK_RPAR statement_or_block {
373c3bd3abdSMatthew Ahrens 			$$ = dt_node_if($3, $5, NULL);
374c3bd3abdSMatthew Ahrens 		}
375c3bd3abdSMatthew Ahrens 	|	DT_KEY_IF DT_TOK_LPAR expression DT_TOK_RPAR
376c3bd3abdSMatthew Ahrens 		statement_or_block DT_KEY_ELSE statement_or_block {
377c3bd3abdSMatthew Ahrens 			$$ = dt_node_if($3, $5, $7);
378c3bd3abdSMatthew Ahrens 		}
3797c478bd9Sstevel@tonic-gate 	;
3807c478bd9Sstevel@tonic-gate 
3817c478bd9Sstevel@tonic-gate argument_expression_list:
3827c478bd9Sstevel@tonic-gate 		assignment_expression
3837c478bd9Sstevel@tonic-gate 	|	argument_expression_list DT_TOK_COMMA assignment_expression {
3847c478bd9Sstevel@tonic-gate 			$$ = LINK($1, $3);
3857c478bd9Sstevel@tonic-gate 		}
3867c478bd9Sstevel@tonic-gate 	;
3877c478bd9Sstevel@tonic-gate 
3887c478bd9Sstevel@tonic-gate primary_expression:
3897c478bd9Sstevel@tonic-gate 		DT_TOK_IDENT { $$ = dt_node_ident($1); }
3907c478bd9Sstevel@tonic-gate 	|	DT_TOK_AGG { $$ = dt_node_ident($1); }
3917c478bd9Sstevel@tonic-gate 	|	DT_TOK_INT { $$ = dt_node_int($1); }
3927c478bd9Sstevel@tonic-gate 	|	DT_TOK_STRING { $$ = dt_node_string($1); }
3937c478bd9Sstevel@tonic-gate 	|	DT_KEY_SELF { $$ = dt_node_ident(DUP("self")); }
3947c478bd9Sstevel@tonic-gate 	|	DT_KEY_THIS { $$ = dt_node_ident(DUP("this")); }
3957c478bd9Sstevel@tonic-gate 	|	DT_TOK_LPAR expression DT_TOK_RPAR { $$ = $2; }
3967c478bd9Sstevel@tonic-gate 	;
3977c478bd9Sstevel@tonic-gate 
3987c478bd9Sstevel@tonic-gate postfix_expression:
3997c478bd9Sstevel@tonic-gate 		primary_expression
4007c478bd9Sstevel@tonic-gate 	|	postfix_expression
4017c478bd9Sstevel@tonic-gate 		    DT_TOK_LBRAC argument_expression_list DT_TOK_RBRAC {
4027c478bd9Sstevel@tonic-gate 			$$ = OP2(DT_TOK_LBRAC, $1, $3);
4037c478bd9Sstevel@tonic-gate 		}
4047c478bd9Sstevel@tonic-gate 	|	postfix_expression DT_TOK_LPAR DT_TOK_RPAR {
4057c478bd9Sstevel@tonic-gate 			$$ = dt_node_func($1, NULL);
4067c478bd9Sstevel@tonic-gate 		}
4077c478bd9Sstevel@tonic-gate 	|	postfix_expression
4087c478bd9Sstevel@tonic-gate 		    DT_TOK_LPAR argument_expression_list DT_TOK_RPAR {
4097c478bd9Sstevel@tonic-gate 			$$ = dt_node_func($1, $3);
4107c478bd9Sstevel@tonic-gate 		}
4117c478bd9Sstevel@tonic-gate 	|	postfix_expression DT_TOK_DOT DT_TOK_IDENT {
4127c478bd9Sstevel@tonic-gate 			$$ = OP2(DT_TOK_DOT, $1, dt_node_ident($3));
4137c478bd9Sstevel@tonic-gate 		}
4147c478bd9Sstevel@tonic-gate 	|	postfix_expression DT_TOK_DOT DT_TOK_TNAME {
4157c478bd9Sstevel@tonic-gate 			$$ = OP2(DT_TOK_DOT, $1, dt_node_ident($3));
4167c478bd9Sstevel@tonic-gate 		}
4177c478bd9Sstevel@tonic-gate 	|	postfix_expression DT_TOK_PTR DT_TOK_IDENT {
4187c478bd9Sstevel@tonic-gate 			$$ = OP2(DT_TOK_PTR, $1, dt_node_ident($3));
4197c478bd9Sstevel@tonic-gate 		}
4207c478bd9Sstevel@tonic-gate 	|	postfix_expression DT_TOK_PTR DT_TOK_TNAME {
4217c478bd9Sstevel@tonic-gate 			$$ = OP2(DT_TOK_PTR, $1, dt_node_ident($3));
4227c478bd9Sstevel@tonic-gate 		}
4237c478bd9Sstevel@tonic-gate 	|	postfix_expression DT_TOK_ADDADD {
4247c478bd9Sstevel@tonic-gate 			$$ = OP1(DT_TOK_POSTINC, $1);
4257c478bd9Sstevel@tonic-gate 		}
4267c478bd9Sstevel@tonic-gate 	|	postfix_expression DT_TOK_SUBSUB {
4277c478bd9Sstevel@tonic-gate 			$$ = OP1(DT_TOK_POSTDEC, $1);
4287c478bd9Sstevel@tonic-gate 		}
429*8019f4e7SToomas Soome 	|	DT_TOK_OFFSETOF DT_TOK_LPAR type_name DT_TOK_COMMA
4307c478bd9Sstevel@tonic-gate 		    DT_TOK_IDENT DT_TOK_RPAR {
4317c478bd9Sstevel@tonic-gate 			$$ = dt_node_offsetof($3, $5);
4327c478bd9Sstevel@tonic-gate 		}
433*8019f4e7SToomas Soome 	|	DT_TOK_OFFSETOF DT_TOK_LPAR type_name DT_TOK_COMMA
4347c478bd9Sstevel@tonic-gate 		    DT_TOK_TNAME DT_TOK_RPAR {
4357c478bd9Sstevel@tonic-gate 			$$ = dt_node_offsetof($3, $5);
4367c478bd9Sstevel@tonic-gate 		}
4377c478bd9Sstevel@tonic-gate 	|	DT_TOK_XLATE DT_TOK_LT type_name DT_TOK_GT
4387c478bd9Sstevel@tonic-gate 		    DT_TOK_LPAR expression DT_TOK_RPAR {
4397c478bd9Sstevel@tonic-gate 			$$ = OP2(DT_TOK_XLATE, dt_node_type($3), $6);
4407c478bd9Sstevel@tonic-gate 		}
4417c478bd9Sstevel@tonic-gate 	;
4427c478bd9Sstevel@tonic-gate 
4437c478bd9Sstevel@tonic-gate unary_expression:
4447c478bd9Sstevel@tonic-gate 		postfix_expression
4457c478bd9Sstevel@tonic-gate 	|	DT_TOK_ADDADD unary_expression { $$ = OP1(DT_TOK_PREINC, $2); }
4467c478bd9Sstevel@tonic-gate 	|	DT_TOK_SUBSUB unary_expression { $$ = OP1(DT_TOK_PREDEC, $2); }
4477c478bd9Sstevel@tonic-gate 	|	unary_operator cast_expression { $$ = OP1($1, $2); }
4487c478bd9Sstevel@tonic-gate 	|	DT_TOK_SIZEOF unary_expression { $$ = OP1(DT_TOK_SIZEOF, $2); }
4497c478bd9Sstevel@tonic-gate 	|	DT_TOK_SIZEOF DT_TOK_LPAR type_name DT_TOK_RPAR {
4507c478bd9Sstevel@tonic-gate 			$$ = OP1(DT_TOK_SIZEOF, dt_node_type($3));
4517c478bd9Sstevel@tonic-gate 		}
4527c478bd9Sstevel@tonic-gate 	|	DT_TOK_STRINGOF unary_expression {
4537c478bd9Sstevel@tonic-gate 			$$ = OP1(DT_TOK_STRINGOF, $2);
4547c478bd9Sstevel@tonic-gate 		}
4557c478bd9Sstevel@tonic-gate 	;
4567c478bd9Sstevel@tonic-gate 
4577c478bd9Sstevel@tonic-gate unary_operator:	DT_TOK_BAND { $$ = DT_TOK_ADDROF; }
4587c478bd9Sstevel@tonic-gate 	|	DT_TOK_MUL { $$ = DT_TOK_DEREF; }
4597c478bd9Sstevel@tonic-gate 	|	DT_TOK_ADD { $$ = DT_TOK_IPOS; }
4607c478bd9Sstevel@tonic-gate 	|	DT_TOK_SUB { $$ = DT_TOK_INEG; }
4617c478bd9Sstevel@tonic-gate 	|	DT_TOK_BNEG { $$ = DT_TOK_BNEG; }
4627c478bd9Sstevel@tonic-gate 	|	DT_TOK_LNEG { $$ = DT_TOK_LNEG; }
4637c478bd9Sstevel@tonic-gate 	;
4647c478bd9Sstevel@tonic-gate 
4657c478bd9Sstevel@tonic-gate cast_expression:
4667c478bd9Sstevel@tonic-gate 		unary_expression
4677c478bd9Sstevel@tonic-gate 	|	DT_TOK_LPAR type_name DT_TOK_RPAR cast_expression {
4687c478bd9Sstevel@tonic-gate 			$$ = OP2(DT_TOK_LPAR, dt_node_type($2), $4);
4697c478bd9Sstevel@tonic-gate 		}
4707c478bd9Sstevel@tonic-gate 	;
4717c478bd9Sstevel@tonic-gate 
4727c478bd9Sstevel@tonic-gate multiplicative_expression:
4737c478bd9Sstevel@tonic-gate 		cast_expression
4747c478bd9Sstevel@tonic-gate 	|	multiplicative_expression DT_TOK_MUL cast_expression {
4757c478bd9Sstevel@tonic-gate 			$$ = OP2(DT_TOK_MUL, $1, $3);
4767c478bd9Sstevel@tonic-gate 		}
4777c478bd9Sstevel@tonic-gate 	|	multiplicative_expression DT_TOK_DIV cast_expression {
4787c478bd9Sstevel@tonic-gate 			$$ = OP2(DT_TOK_DIV, $1, $3);
4797c478bd9Sstevel@tonic-gate 		}
4807c478bd9Sstevel@tonic-gate 	|	multiplicative_expression DT_TOK_MOD cast_expression {
4817c478bd9Sstevel@tonic-gate 			$$ = OP2(DT_TOK_MOD, $1, $3);
4827c478bd9Sstevel@tonic-gate 		}
4837c478bd9Sstevel@tonic-gate 	;
4847c478bd9Sstevel@tonic-gate 
4857c478bd9Sstevel@tonic-gate additive_expression:
4867c478bd9Sstevel@tonic-gate 		multiplicative_expression
4877c478bd9Sstevel@tonic-gate 	|	additive_expression DT_TOK_ADD multiplicative_expression {
4887c478bd9Sstevel@tonic-gate 			$$ = OP2(DT_TOK_ADD, $1, $3);
4897c478bd9Sstevel@tonic-gate 		}
4907c478bd9Sstevel@tonic-gate 	|	additive_expression DT_TOK_SUB multiplicative_expression {
4917c478bd9Sstevel@tonic-gate 			$$ = OP2(DT_TOK_SUB, $1, $3);
4927c478bd9Sstevel@tonic-gate 		}
4937c478bd9Sstevel@tonic-gate 	;
4947c478bd9Sstevel@tonic-gate 
4957c478bd9Sstevel@tonic-gate shift_expression:
4967c478bd9Sstevel@tonic-gate 		additive_expression
4977c478bd9Sstevel@tonic-gate 	|	shift_expression DT_TOK_LSH additive_expression {
4987c478bd9Sstevel@tonic-gate 			$$ = OP2(DT_TOK_LSH, $1, $3);
4997c478bd9Sstevel@tonic-gate 		}
5007c478bd9Sstevel@tonic-gate 	|	shift_expression DT_TOK_RSH additive_expression {
5017c478bd9Sstevel@tonic-gate 			$$ = OP2(DT_TOK_RSH, $1, $3);
5027c478bd9Sstevel@tonic-gate 		}
5037c478bd9Sstevel@tonic-gate 	;
5047c478bd9Sstevel@tonic-gate 
5057c478bd9Sstevel@tonic-gate relational_expression:
5067c478bd9Sstevel@tonic-gate 		shift_expression
5077c478bd9Sstevel@tonic-gate 	|	relational_expression DT_TOK_LT shift_expression {
5087c478bd9Sstevel@tonic-gate 			$$ = OP2(DT_TOK_LT, $1, $3);
5097c478bd9Sstevel@tonic-gate 		}
5107c478bd9Sstevel@tonic-gate 	|	relational_expression DT_TOK_GT shift_expression {
5117c478bd9Sstevel@tonic-gate 			$$ = OP2(DT_TOK_GT, $1, $3);
5127c478bd9Sstevel@tonic-gate 		}
5137c478bd9Sstevel@tonic-gate 	|	relational_expression DT_TOK_LE shift_expression {
5147c478bd9Sstevel@tonic-gate 			$$ = OP2(DT_TOK_LE, $1, $3);
5157c478bd9Sstevel@tonic-gate 		}
5167c478bd9Sstevel@tonic-gate 	|	relational_expression DT_TOK_GE shift_expression {
5177c478bd9Sstevel@tonic-gate 			$$ = OP2(DT_TOK_GE, $1, $3);
5187c478bd9Sstevel@tonic-gate 		}
5197c478bd9Sstevel@tonic-gate 	;
5207c478bd9Sstevel@tonic-gate 
5217c478bd9Sstevel@tonic-gate equality_expression:
5227c478bd9Sstevel@tonic-gate 		relational_expression
5237c478bd9Sstevel@tonic-gate 	|	equality_expression DT_TOK_EQU relational_expression {
5247c478bd9Sstevel@tonic-gate 			$$ = OP2(DT_TOK_EQU, $1, $3);
5257c478bd9Sstevel@tonic-gate 		}
5267c478bd9Sstevel@tonic-gate 	|	equality_expression DT_TOK_NEQ relational_expression {
5277c478bd9Sstevel@tonic-gate 			$$ = OP2(DT_TOK_NEQ, $1, $3);
5287c478bd9Sstevel@tonic-gate 		}
5297c478bd9Sstevel@tonic-gate 	;
5307c478bd9Sstevel@tonic-gate 
5317c478bd9Sstevel@tonic-gate and_expression:
5327c478bd9Sstevel@tonic-gate 		equality_expression
5337c478bd9Sstevel@tonic-gate 	|	and_expression DT_TOK_BAND equality_expression {
5347c478bd9Sstevel@tonic-gate 			$$ = OP2(DT_TOK_BAND, $1, $3);
5357c478bd9Sstevel@tonic-gate 		}
5367c478bd9Sstevel@tonic-gate 	;
5377c478bd9Sstevel@tonic-gate 
5387c478bd9Sstevel@tonic-gate exclusive_or_expression:
5397c478bd9Sstevel@tonic-gate 		and_expression
5407c478bd9Sstevel@tonic-gate 	|	exclusive_or_expression DT_TOK_XOR and_expression {
5417c478bd9Sstevel@tonic-gate 			$$ = OP2(DT_TOK_XOR, $1, $3);
5427c478bd9Sstevel@tonic-gate 		}
5437c478bd9Sstevel@tonic-gate 	;
5447c478bd9Sstevel@tonic-gate 
5457c478bd9Sstevel@tonic-gate inclusive_or_expression:
5467c478bd9Sstevel@tonic-gate 		exclusive_or_expression
5477c478bd9Sstevel@tonic-gate 	|	inclusive_or_expression DT_TOK_BOR exclusive_or_expression {
5487c478bd9Sstevel@tonic-gate 			$$ = OP2(DT_TOK_BOR, $1, $3);
5497c478bd9Sstevel@tonic-gate 		}
5507c478bd9Sstevel@tonic-gate 	;
5517c478bd9Sstevel@tonic-gate 
5527c478bd9Sstevel@tonic-gate logical_and_expression:
5537c478bd9Sstevel@tonic-gate 		inclusive_or_expression
5547c478bd9Sstevel@tonic-gate 	|	logical_and_expression DT_TOK_LAND inclusive_or_expression {
5557c478bd9Sstevel@tonic-gate 			$$ = OP2(DT_TOK_LAND, $1, $3);
5567c478bd9Sstevel@tonic-gate 		}
5577c478bd9Sstevel@tonic-gate 	;
5587c478bd9Sstevel@tonic-gate 
5597c478bd9Sstevel@tonic-gate logical_xor_expression:
5607c478bd9Sstevel@tonic-gate 		logical_and_expression
5617c478bd9Sstevel@tonic-gate 	|	logical_xor_expression DT_TOK_LXOR logical_and_expression {
5627c478bd9Sstevel@tonic-gate 			$$ = OP2(DT_TOK_LXOR, $1, $3);
5637c478bd9Sstevel@tonic-gate 		}
5647c478bd9Sstevel@tonic-gate 	;
5657c478bd9Sstevel@tonic-gate 
5667c478bd9Sstevel@tonic-gate logical_or_expression:
5677c478bd9Sstevel@tonic-gate 		logical_xor_expression
5687c478bd9Sstevel@tonic-gate 	|	logical_or_expression DT_TOK_LOR logical_xor_expression {
5697c478bd9Sstevel@tonic-gate 			$$ = OP2(DT_TOK_LOR, $1, $3);
5707c478bd9Sstevel@tonic-gate 		}
5717c478bd9Sstevel@tonic-gate 	;
5727c478bd9Sstevel@tonic-gate 
5737c478bd9Sstevel@tonic-gate constant_expression: conditional_expression
5747c478bd9Sstevel@tonic-gate 	;
5757c478bd9Sstevel@tonic-gate 
5767c478bd9Sstevel@tonic-gate conditional_expression:
5777c478bd9Sstevel@tonic-gate 		logical_or_expression
5787c478bd9Sstevel@tonic-gate 	|	logical_or_expression DT_TOK_QUESTION expression DT_TOK_COLON
5797c478bd9Sstevel@tonic-gate 		    conditional_expression { $$ = OP3($1, $3, $5); }
5807c478bd9Sstevel@tonic-gate 	;
5817c478bd9Sstevel@tonic-gate 
5827c478bd9Sstevel@tonic-gate assignment_expression:
5837c478bd9Sstevel@tonic-gate 		conditional_expression
5847c478bd9Sstevel@tonic-gate 	|	unary_expression assignment_operator assignment_expression {
5857c478bd9Sstevel@tonic-gate 			$$ = OP2($2, $1, $3);
5867c478bd9Sstevel@tonic-gate 		}
5877c478bd9Sstevel@tonic-gate 	;
5887c478bd9Sstevel@tonic-gate 
5897c478bd9Sstevel@tonic-gate assignment_operator:
5907c478bd9Sstevel@tonic-gate 		DT_TOK_ASGN   { $$ = DT_TOK_ASGN; }
5917c478bd9Sstevel@tonic-gate 	|	DT_TOK_MUL_EQ { $$ = DT_TOK_MUL_EQ; }
5927c478bd9Sstevel@tonic-gate 	|	DT_TOK_DIV_EQ { $$ = DT_TOK_DIV_EQ; }
5937c478bd9Sstevel@tonic-gate 	|	DT_TOK_MOD_EQ { $$ = DT_TOK_MOD_EQ; }
5947c478bd9Sstevel@tonic-gate 	|	DT_TOK_ADD_EQ { $$ = DT_TOK_ADD_EQ; }
5957c478bd9Sstevel@tonic-gate 	|	DT_TOK_SUB_EQ { $$ = DT_TOK_SUB_EQ; }
5967c478bd9Sstevel@tonic-gate 	|	DT_TOK_LSH_EQ { $$ = DT_TOK_LSH_EQ; }
5977c478bd9Sstevel@tonic-gate 	|	DT_TOK_RSH_EQ { $$ = DT_TOK_RSH_EQ; }
5987c478bd9Sstevel@tonic-gate 	|	DT_TOK_AND_EQ { $$ = DT_TOK_AND_EQ; }
5997c478bd9Sstevel@tonic-gate 	|	DT_TOK_XOR_EQ { $$ = DT_TOK_XOR_EQ; }
6007c478bd9Sstevel@tonic-gate 	|	DT_TOK_OR_EQ  { $$ = DT_TOK_OR_EQ; }
6017c478bd9Sstevel@tonic-gate 	;
6027c478bd9Sstevel@tonic-gate 
6037c478bd9Sstevel@tonic-gate expression:	assignment_expression
6047c478bd9Sstevel@tonic-gate 	|	expression DT_TOK_COMMA assignment_expression {
6057c478bd9Sstevel@tonic-gate 			$$ = OP2(DT_TOK_COMMA, $1, $3);
6067c478bd9Sstevel@tonic-gate 		}
6077c478bd9Sstevel@tonic-gate 	;
6087c478bd9Sstevel@tonic-gate 
6097c478bd9Sstevel@tonic-gate declaration:	declaration_specifiers ';' {
6107c478bd9Sstevel@tonic-gate 			$$ = dt_node_decl();
6117c478bd9Sstevel@tonic-gate 			dt_decl_free(dt_decl_pop());
6127c478bd9Sstevel@tonic-gate 			yybegin(YYS_CLAUSE);
6137c478bd9Sstevel@tonic-gate 		}
6147c478bd9Sstevel@tonic-gate 	|	declaration_specifiers init_declarator_list ';' {
6157c478bd9Sstevel@tonic-gate 			$$ = $2;
6167c478bd9Sstevel@tonic-gate 			dt_decl_free(dt_decl_pop());
6177c478bd9Sstevel@tonic-gate 			yybegin(YYS_CLAUSE);
6187c478bd9Sstevel@tonic-gate 		}
6197c478bd9Sstevel@tonic-gate 	;
6207c478bd9Sstevel@tonic-gate 
6217c478bd9Sstevel@tonic-gate declaration_specifiers:
6227c478bd9Sstevel@tonic-gate 		d_storage_class_specifier
6237c478bd9Sstevel@tonic-gate 	|	d_storage_class_specifier declaration_specifiers
6247c478bd9Sstevel@tonic-gate 	|	type_specifier
6257c478bd9Sstevel@tonic-gate 	|	type_specifier declaration_specifiers
6267c478bd9Sstevel@tonic-gate 	|	type_qualifier
6277c478bd9Sstevel@tonic-gate 	|	type_qualifier declaration_specifiers
6287c478bd9Sstevel@tonic-gate 	;
6297c478bd9Sstevel@tonic-gate 
6307c478bd9Sstevel@tonic-gate parameter_declaration_specifiers:
6317c478bd9Sstevel@tonic-gate 		storage_class_specifier
6327c478bd9Sstevel@tonic-gate 	|	storage_class_specifier declaration_specifiers
6337c478bd9Sstevel@tonic-gate 	|	type_specifier
6347c478bd9Sstevel@tonic-gate 	|	type_specifier declaration_specifiers
6357c478bd9Sstevel@tonic-gate 	|	type_qualifier
6367c478bd9Sstevel@tonic-gate 	|	type_qualifier declaration_specifiers
6377c478bd9Sstevel@tonic-gate 	;
6387c478bd9Sstevel@tonic-gate 
6397c478bd9Sstevel@tonic-gate storage_class_specifier:
6407c478bd9Sstevel@tonic-gate 		DT_KEY_AUTO { dt_decl_class(DT_DC_AUTO); }
6417c478bd9Sstevel@tonic-gate 	|	DT_KEY_REGISTER { dt_decl_class(DT_DC_REGISTER); }
6427c478bd9Sstevel@tonic-gate 	|	DT_KEY_STATIC { dt_decl_class(DT_DC_STATIC); }
6437c478bd9Sstevel@tonic-gate 	|	DT_KEY_EXTERN { dt_decl_class(DT_DC_EXTERN); }
6447c478bd9Sstevel@tonic-gate 	|	DT_KEY_TYPEDEF { dt_decl_class(DT_DC_TYPEDEF); }
6457c478bd9Sstevel@tonic-gate 	;
6467c478bd9Sstevel@tonic-gate 
6477c478bd9Sstevel@tonic-gate d_storage_class_specifier:
6487c478bd9Sstevel@tonic-gate 		storage_class_specifier
6497c478bd9Sstevel@tonic-gate 	|	DT_KEY_SELF { dt_decl_class(DT_DC_SELF); }
6507c478bd9Sstevel@tonic-gate 	|	DT_KEY_THIS { dt_decl_class(DT_DC_THIS); }
6517c478bd9Sstevel@tonic-gate 	;
6527c478bd9Sstevel@tonic-gate 
6537c478bd9Sstevel@tonic-gate type_specifier:	DT_KEY_VOID { $$ = dt_decl_spec(CTF_K_INTEGER, DUP("void")); }
6547c478bd9Sstevel@tonic-gate 	|	DT_KEY_CHAR { $$ = dt_decl_spec(CTF_K_INTEGER, DUP("char")); }
6557c478bd9Sstevel@tonic-gate 	|	DT_KEY_SHORT { $$ = dt_decl_attr(DT_DA_SHORT); }
6567c478bd9Sstevel@tonic-gate 	|	DT_KEY_INT { $$ = dt_decl_spec(CTF_K_INTEGER, DUP("int")); }
6577c478bd9Sstevel@tonic-gate 	|	DT_KEY_LONG { $$ = dt_decl_attr(DT_DA_LONG); }
6587c478bd9Sstevel@tonic-gate 	|	DT_KEY_FLOAT { $$ = dt_decl_spec(CTF_K_FLOAT, DUP("float")); }
6597c478bd9Sstevel@tonic-gate 	|	DT_KEY_DOUBLE { $$ = dt_decl_spec(CTF_K_FLOAT, DUP("double")); }
6607c478bd9Sstevel@tonic-gate 	|	DT_KEY_SIGNED { $$ = dt_decl_attr(DT_DA_SIGNED); }
6617c478bd9Sstevel@tonic-gate 	|	DT_KEY_UNSIGNED { $$ = dt_decl_attr(DT_DA_UNSIGNED); }
662a386cc11SRobert Mustacchi 	|	DT_KEY_USERLAND { $$ = dt_decl_attr(DT_DA_USER); }
6637c478bd9Sstevel@tonic-gate 	|	DT_KEY_STRING {
6647c478bd9Sstevel@tonic-gate 			$$ = dt_decl_spec(CTF_K_TYPEDEF, DUP("string"));
6657c478bd9Sstevel@tonic-gate 		}
6667c478bd9Sstevel@tonic-gate 	|	DT_TOK_TNAME { $$ = dt_decl_spec(CTF_K_TYPEDEF, $1); }
6677c478bd9Sstevel@tonic-gate 	|	struct_or_union_specifier
6687c478bd9Sstevel@tonic-gate 	|	enum_specifier
6697c478bd9Sstevel@tonic-gate 	;
6707c478bd9Sstevel@tonic-gate 
6717c478bd9Sstevel@tonic-gate type_qualifier:	DT_KEY_CONST { $$ = dt_decl_attr(DT_DA_CONST); }
6727c478bd9Sstevel@tonic-gate 	|	DT_KEY_RESTRICT { $$ = dt_decl_attr(DT_DA_RESTRICT); }
6737c478bd9Sstevel@tonic-gate 	|	DT_KEY_VOLATILE { $$ = dt_decl_attr(DT_DA_VOLATILE); }
6747c478bd9Sstevel@tonic-gate 	;
6757c478bd9Sstevel@tonic-gate 
6767c478bd9Sstevel@tonic-gate struct_or_union_specifier:
6777c478bd9Sstevel@tonic-gate 		struct_or_union_definition struct_declaration_list '}' {
6787c478bd9Sstevel@tonic-gate 			$$ = dt_scope_pop();
6797c478bd9Sstevel@tonic-gate 		}
6807c478bd9Sstevel@tonic-gate 	|	struct_or_union DT_TOK_IDENT { $$ = dt_decl_spec($1, $2); }
6817c478bd9Sstevel@tonic-gate 	|	struct_or_union DT_TOK_TNAME { $$ = dt_decl_spec($1, $2); }
6827c478bd9Sstevel@tonic-gate 	;
6837c478bd9Sstevel@tonic-gate 
6847c478bd9Sstevel@tonic-gate struct_or_union_definition:
6857c478bd9Sstevel@tonic-gate 		struct_or_union '{' { dt_decl_sou($1, NULL); }
6867c478bd9Sstevel@tonic-gate 	|	struct_or_union DT_TOK_IDENT '{' { dt_decl_sou($1, $2); }
6877c478bd9Sstevel@tonic-gate 	|	struct_or_union DT_TOK_TNAME '{' { dt_decl_sou($1, $2); }
6887c478bd9Sstevel@tonic-gate 	;
6897c478bd9Sstevel@tonic-gate 
6907c478bd9Sstevel@tonic-gate struct_or_union:
6917c478bd9Sstevel@tonic-gate 		DT_KEY_STRUCT { $$ = CTF_K_STRUCT; }
6927c478bd9Sstevel@tonic-gate 	|	DT_KEY_UNION { $$ = CTF_K_UNION; }
6937c478bd9Sstevel@tonic-gate 	;
6947c478bd9Sstevel@tonic-gate 
6957c478bd9Sstevel@tonic-gate struct_declaration_list:
6967c478bd9Sstevel@tonic-gate 		struct_declaration
6977c478bd9Sstevel@tonic-gate 	|	struct_declaration_list struct_declaration
6987c478bd9Sstevel@tonic-gate 	;
6997c478bd9Sstevel@tonic-gate 
7007c478bd9Sstevel@tonic-gate init_declarator_list:
7017c478bd9Sstevel@tonic-gate 		init_declarator
7027c478bd9Sstevel@tonic-gate 	|	init_declarator_list DT_TOK_COMMA init_declarator {
7037c478bd9Sstevel@tonic-gate 			$$ = LINK($1, $3);
7047c478bd9Sstevel@tonic-gate 		}
7057c478bd9Sstevel@tonic-gate 	;
7067c478bd9Sstevel@tonic-gate 
7077c478bd9Sstevel@tonic-gate init_declarator:
7087c478bd9Sstevel@tonic-gate 		declarator {
7097c478bd9Sstevel@tonic-gate 			$$ = dt_node_decl();
7107c478bd9Sstevel@tonic-gate 			dt_decl_reset();
7117c478bd9Sstevel@tonic-gate 		}
7127c478bd9Sstevel@tonic-gate 	;
7137c478bd9Sstevel@tonic-gate 
7147c478bd9Sstevel@tonic-gate struct_declaration:
7157c478bd9Sstevel@tonic-gate 		specifier_qualifier_list struct_declarator_list ';' {
7167c478bd9Sstevel@tonic-gate 			dt_decl_free(dt_decl_pop());
7177c478bd9Sstevel@tonic-gate 		}
7187c478bd9Sstevel@tonic-gate 	;
7197c478bd9Sstevel@tonic-gate 
7207c478bd9Sstevel@tonic-gate specifier_qualifier_list:
7217c478bd9Sstevel@tonic-gate 		type_specifier
7227c478bd9Sstevel@tonic-gate 	|	type_specifier specifier_qualifier_list { $$ = $2; }
7237c478bd9Sstevel@tonic-gate 	|	type_qualifier
7247c478bd9Sstevel@tonic-gate 	|	type_qualifier specifier_qualifier_list { $$ = $2; }
7257c478bd9Sstevel@tonic-gate 	;
7267c478bd9Sstevel@tonic-gate 
7277c478bd9Sstevel@tonic-gate struct_declarator_list:
7287c478bd9Sstevel@tonic-gate 		struct_declarator
7297c478bd9Sstevel@tonic-gate 	|	struct_declarator_list DT_TOK_COMMA struct_declarator
7307c478bd9Sstevel@tonic-gate 	;
7317c478bd9Sstevel@tonic-gate 
7327c478bd9Sstevel@tonic-gate struct_declarator:
7337c478bd9Sstevel@tonic-gate 		declarator { dt_decl_member(NULL); }
7347c478bd9Sstevel@tonic-gate 	|	DT_TOK_COLON constant_expression { dt_decl_member($2); }
7357c478bd9Sstevel@tonic-gate 	|	declarator DT_TOK_COLON constant_expression {
7367c478bd9Sstevel@tonic-gate 			dt_decl_member($3);
7377c478bd9Sstevel@tonic-gate 		}
7387c478bd9Sstevel@tonic-gate 	;
7397c478bd9Sstevel@tonic-gate 
7407c478bd9Sstevel@tonic-gate enum_specifier:
7417c478bd9Sstevel@tonic-gate 		enum_definition enumerator_list '}' { $$ = dt_scope_pop(); }
742*8019f4e7SToomas Soome 	|	enum_definition enumerator_list DT_TOK_COMMA '}' { $$ = dt_scope_pop(); }
7437c478bd9Sstevel@tonic-gate 	|	DT_KEY_ENUM DT_TOK_IDENT { $$ = dt_decl_spec(CTF_K_ENUM, $2); }
7447c478bd9Sstevel@tonic-gate 	|	DT_KEY_ENUM DT_TOK_TNAME { $$ = dt_decl_spec(CTF_K_ENUM, $2); }
7457c478bd9Sstevel@tonic-gate 	;
7467c478bd9Sstevel@tonic-gate 
7477c478bd9Sstevel@tonic-gate enum_definition:
7487c478bd9Sstevel@tonic-gate 		DT_KEY_ENUM '{' { dt_decl_enum(NULL); }
7497c478bd9Sstevel@tonic-gate 	|	DT_KEY_ENUM DT_TOK_IDENT '{' { dt_decl_enum($2); }
7507c478bd9Sstevel@tonic-gate 	|	DT_KEY_ENUM DT_TOK_TNAME '{' { dt_decl_enum($2); }
7517c478bd9Sstevel@tonic-gate 	;
7527c478bd9Sstevel@tonic-gate 
7537c478bd9Sstevel@tonic-gate enumerator_list:
7547c478bd9Sstevel@tonic-gate 		enumerator
7557c478bd9Sstevel@tonic-gate 	|	enumerator_list DT_TOK_COMMA enumerator
7567c478bd9Sstevel@tonic-gate 	;
7577c478bd9Sstevel@tonic-gate 
7587c478bd9Sstevel@tonic-gate enumerator:	DT_TOK_IDENT { dt_decl_enumerator($1, NULL); }
7597c478bd9Sstevel@tonic-gate 	|	DT_TOK_IDENT DT_TOK_ASGN expression {
7607c478bd9Sstevel@tonic-gate 			dt_decl_enumerator($1, $3);
7617c478bd9Sstevel@tonic-gate 		}
7627c478bd9Sstevel@tonic-gate 	;
7637c478bd9Sstevel@tonic-gate 
7647c478bd9Sstevel@tonic-gate declarator:	direct_declarator
7657c478bd9Sstevel@tonic-gate 	|	pointer direct_declarator
7667c478bd9Sstevel@tonic-gate 	;
7677c478bd9Sstevel@tonic-gate 
7687c478bd9Sstevel@tonic-gate direct_declarator:
7697c478bd9Sstevel@tonic-gate 		DT_TOK_IDENT { $$ = dt_decl_ident($1); }
7707c478bd9Sstevel@tonic-gate 	|	lparen declarator DT_TOK_RPAR { $$ = $2; }
7717c478bd9Sstevel@tonic-gate 	|	direct_declarator array { dt_decl_array($2); }
7727c478bd9Sstevel@tonic-gate 	|	direct_declarator function { dt_decl_func($1, $2); }
7737c478bd9Sstevel@tonic-gate 	;
7747c478bd9Sstevel@tonic-gate 
7757c478bd9Sstevel@tonic-gate lparen:		DT_TOK_LPAR { dt_decl_top()->dd_attr |= DT_DA_PAREN; }
7767c478bd9Sstevel@tonic-gate 	;
7777c478bd9Sstevel@tonic-gate 
7787c478bd9Sstevel@tonic-gate pointer:	DT_TOK_MUL { $$ = dt_decl_ptr(); }
7797c478bd9Sstevel@tonic-gate 	|	DT_TOK_MUL type_qualifier_list { $$ = dt_decl_ptr(); }
7807c478bd9Sstevel@tonic-gate 	|	DT_TOK_MUL pointer { $$ = dt_decl_ptr(); }
7817c478bd9Sstevel@tonic-gate 	|	DT_TOK_MUL type_qualifier_list pointer { $$ = dt_decl_ptr(); }
7827c478bd9Sstevel@tonic-gate 	;
7837c478bd9Sstevel@tonic-gate 
7847c478bd9Sstevel@tonic-gate type_qualifier_list:
7857c478bd9Sstevel@tonic-gate 		type_qualifier
7867c478bd9Sstevel@tonic-gate 	|	type_qualifier_list type_qualifier { $$ = $2; }
7877c478bd9Sstevel@tonic-gate 	;
7887c478bd9Sstevel@tonic-gate 
7897c478bd9Sstevel@tonic-gate parameter_type_list:
7907c478bd9Sstevel@tonic-gate 		parameter_list
7917c478bd9Sstevel@tonic-gate 	|	DT_TOK_ELLIPSIS { $$ = dt_node_vatype(); }
7927c478bd9Sstevel@tonic-gate 	|	parameter_list DT_TOK_COMMA DT_TOK_ELLIPSIS {
7937c478bd9Sstevel@tonic-gate 			$$ = LINK($1, dt_node_vatype());
7947c478bd9Sstevel@tonic-gate 		}
7957c478bd9Sstevel@tonic-gate 	;
7967c478bd9Sstevel@tonic-gate 
7977c478bd9Sstevel@tonic-gate parameter_list:	parameter_declaration
7987c478bd9Sstevel@tonic-gate 	|	parameter_list DT_TOK_COMMA parameter_declaration {
7997c478bd9Sstevel@tonic-gate 			$$ = LINK($1, $3);
8007c478bd9Sstevel@tonic-gate 		}
8017c478bd9Sstevel@tonic-gate 	;
8027c478bd9Sstevel@tonic-gate 
8037c478bd9Sstevel@tonic-gate parameter_declaration:
8047c478bd9Sstevel@tonic-gate 		parameter_declaration_specifiers {
8057c478bd9Sstevel@tonic-gate 			$$ = dt_node_type(NULL);
8067c478bd9Sstevel@tonic-gate 		}
8077c478bd9Sstevel@tonic-gate 	|	parameter_declaration_specifiers declarator {
8087c478bd9Sstevel@tonic-gate 			$$ = dt_node_type(NULL);
8097c478bd9Sstevel@tonic-gate 		}
8107c478bd9Sstevel@tonic-gate 	|	parameter_declaration_specifiers abstract_declarator {
8117c478bd9Sstevel@tonic-gate 			$$ = dt_node_type(NULL);
8127c478bd9Sstevel@tonic-gate 		}
8137c478bd9Sstevel@tonic-gate 	;
8147c478bd9Sstevel@tonic-gate 
8157c478bd9Sstevel@tonic-gate type_name:	specifier_qualifier_list {
8167c478bd9Sstevel@tonic-gate 			$$ = dt_decl_pop();
8177c478bd9Sstevel@tonic-gate 		}
8187c478bd9Sstevel@tonic-gate 	|	specifier_qualifier_list abstract_declarator {
8197c478bd9Sstevel@tonic-gate 			$$ = dt_decl_pop();
8207c478bd9Sstevel@tonic-gate 		}
8217c478bd9Sstevel@tonic-gate 	;
8227c478bd9Sstevel@tonic-gate 
8237c478bd9Sstevel@tonic-gate abstract_declarator:
8247c478bd9Sstevel@tonic-gate 		pointer
8257c478bd9Sstevel@tonic-gate 	|	direct_abstract_declarator
8267c478bd9Sstevel@tonic-gate 	|	pointer direct_abstract_declarator
8277c478bd9Sstevel@tonic-gate 	;
8287c478bd9Sstevel@tonic-gate 
8297c478bd9Sstevel@tonic-gate direct_abstract_declarator:
8307c478bd9Sstevel@tonic-gate 		lparen abstract_declarator DT_TOK_RPAR { $$ = $2; }
8317c478bd9Sstevel@tonic-gate 	|	direct_abstract_declarator array { dt_decl_array($2); }
8327c478bd9Sstevel@tonic-gate 	|	array { dt_decl_array($1); $$ = NULL; }
8337c478bd9Sstevel@tonic-gate 	|	direct_abstract_declarator function { dt_decl_func($1, $2); }
8347c478bd9Sstevel@tonic-gate 	|	function { dt_decl_func(NULL, $1); }
8357c478bd9Sstevel@tonic-gate 	;
8367c478bd9Sstevel@tonic-gate 
837e4586ebfSmws array:		DT_TOK_LBRAC { dt_scope_push(NULL, CTF_ERR); }
838e4586ebfSmws 		    array_parameters DT_TOK_RBRAC {
8397c478bd9Sstevel@tonic-gate 			dt_scope_pop();
8407c478bd9Sstevel@tonic-gate 			$$ = $3;
8417c478bd9Sstevel@tonic-gate 		}
8427c478bd9Sstevel@tonic-gate 	;
8437c478bd9Sstevel@tonic-gate 
844e4586ebfSmws array_parameters:
845*8019f4e7SToomas Soome 		/* empty */		{ $$ = NULL; }
846e4586ebfSmws 	|	constant_expression	{ $$ = $1; }
847e4586ebfSmws 	|	parameter_type_list	{ $$ = $1; }
848e4586ebfSmws 	;
849e4586ebfSmws 
850e4586ebfSmws function:	DT_TOK_LPAR { dt_scope_push(NULL, CTF_ERR); }
851e4586ebfSmws 		    function_parameters DT_TOK_RPAR {
8527c478bd9Sstevel@tonic-gate 			dt_scope_pop();
8537c478bd9Sstevel@tonic-gate 			$$ = $3;
8547c478bd9Sstevel@tonic-gate 		}
8557c478bd9Sstevel@tonic-gate 	;
8567c478bd9Sstevel@tonic-gate 
857e4586ebfSmws function_parameters:
858*8019f4e7SToomas Soome 		/* empty */		{ $$ = NULL; }
859e4586ebfSmws 	|	parameter_type_list	{ $$ = $1; }
860e4586ebfSmws 	;
861e4586ebfSmws 
8627c478bd9Sstevel@tonic-gate %%
863