16ff6d951SJohn Birrell %{
26ff6d951SJohn Birrell /*
36ff6d951SJohn Birrell  * CDDL HEADER START
46ff6d951SJohn Birrell  *
56ff6d951SJohn Birrell  * The contents of this file are subject to the terms of the
66ff6d951SJohn Birrell  * Common Development and Distribution License, Version 1.0 only
76ff6d951SJohn Birrell  * (the "License").  You may not use this file except in compliance
86ff6d951SJohn Birrell  * with the License.
96ff6d951SJohn Birrell  *
106ff6d951SJohn Birrell  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
116ff6d951SJohn Birrell  * or http://www.opensolaris.org/os/licensing.
126ff6d951SJohn Birrell  * See the License for the specific language governing permissions
136ff6d951SJohn Birrell  * and limitations under the License.
146ff6d951SJohn Birrell  *
156ff6d951SJohn Birrell  * When distributing Covered Code, include this CDDL HEADER in each
166ff6d951SJohn Birrell  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
176ff6d951SJohn Birrell  * If applicable, add the following below this CDDL HEADER, with the
186ff6d951SJohn Birrell  * fields enclosed by brackets "[]" replaced with your own identifying
196ff6d951SJohn Birrell  * information: Portions Copyright [yyyy] [name of copyright owner]
206ff6d951SJohn Birrell  *
216ff6d951SJohn Birrell  * CDDL HEADER END
226ff6d951SJohn Birrell  *
236ff6d951SJohn Birrell  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
246ff6d951SJohn Birrell  * Use is subject to license terms.
256ff6d951SJohn Birrell  */
268e648814SRui Paulo 
278e648814SRui Paulo /*
288e648814SRui Paulo  * Copyright (c) 2014, 2016 by Delphix. All rights reserved.
298e648814SRui Paulo  * Copyright (c) 2013, Joyent, Inc. All rights reserved.
306ff6d951SJohn Birrell  */
316ff6d951SJohn Birrell 
326ff6d951SJohn Birrell #include <dt_impl.h>
336ff6d951SJohn Birrell 
346ff6d951SJohn Birrell #define	OP1(op, c)	dt_node_op1(op, c)
356ff6d951SJohn Birrell #define	OP2(op, l, r)	dt_node_op2(op, l, r)
366ff6d951SJohn Birrell #define	OP3(x, y, z)	dt_node_op3(x, y, z)
376ff6d951SJohn Birrell #define	LINK(l, r)	dt_node_link(l, r)
386ff6d951SJohn Birrell #define	DUP(s)		strdup(s)
396ff6d951SJohn Birrell 
406ff6d951SJohn Birrell %}
416ff6d951SJohn Birrell 
426ff6d951SJohn Birrell %union {
436ff6d951SJohn Birrell 	dt_node_t *l_node;
446ff6d951SJohn Birrell 	dt_decl_t *l_decl;
456ff6d951SJohn Birrell 	char *l_str;
466ff6d951SJohn Birrell 	uintmax_t l_int;
476ff6d951SJohn Birrell 	int l_tok;
486ff6d951SJohn Birrell }
496ff6d951SJohn Birrell 
506ff6d951SJohn Birrell %token	DT_TOK_COMMA DT_TOK_ELLIPSIS
516ff6d951SJohn Birrell %token	DT_TOK_ASGN DT_TOK_ADD_EQ DT_TOK_SUB_EQ DT_TOK_MUL_EQ
526ff6d951SJohn Birrell %token	DT_TOK_DIV_EQ DT_TOK_MOD_EQ DT_TOK_AND_EQ DT_TOK_XOR_EQ DT_TOK_OR_EQ
536ff6d951SJohn Birrell %token	DT_TOK_LSH_EQ DT_TOK_RSH_EQ DT_TOK_QUESTION DT_TOK_COLON
546ff6d951SJohn Birrell %token	DT_TOK_LOR DT_TOK_LXOR DT_TOK_LAND
556ff6d951SJohn Birrell %token	DT_TOK_BOR DT_TOK_XOR DT_TOK_BAND DT_TOK_EQU DT_TOK_NEQ
566ff6d951SJohn Birrell %token	DT_TOK_LT DT_TOK_LE DT_TOK_GT DT_TOK_GE DT_TOK_LSH DT_TOK_RSH
576ff6d951SJohn Birrell %token	DT_TOK_ADD DT_TOK_SUB DT_TOK_MUL DT_TOK_DIV DT_TOK_MOD
586ff6d951SJohn Birrell %token	DT_TOK_LNEG DT_TOK_BNEG DT_TOK_ADDADD DT_TOK_SUBSUB
596ff6d951SJohn Birrell %token	DT_TOK_PREINC DT_TOK_POSTINC DT_TOK_PREDEC DT_TOK_POSTDEC
606ff6d951SJohn Birrell %token	DT_TOK_IPOS DT_TOK_INEG DT_TOK_DEREF DT_TOK_ADDROF
616ff6d951SJohn Birrell %token	DT_TOK_OFFSETOF DT_TOK_SIZEOF DT_TOK_STRINGOF DT_TOK_XLATE
626ff6d951SJohn Birrell %token	DT_TOK_LPAR DT_TOK_RPAR DT_TOK_LBRAC DT_TOK_RBRAC DT_TOK_PTR DT_TOK_DOT
636ff6d951SJohn Birrell 
646ff6d951SJohn Birrell %token <l_str>	DT_TOK_STRING
656ff6d951SJohn Birrell %token <l_str>	DT_TOK_IDENT
666ff6d951SJohn Birrell %token <l_str>	DT_TOK_PSPEC
676ff6d951SJohn Birrell %token <l_str>	DT_TOK_AGG
686ff6d951SJohn Birrell %token <l_str>	DT_TOK_TNAME
696ff6d951SJohn Birrell %token <l_int>	DT_TOK_INT
706ff6d951SJohn Birrell 
716ff6d951SJohn Birrell %token	DT_KEY_AUTO
726ff6d951SJohn Birrell %token	DT_KEY_BREAK
736ff6d951SJohn Birrell %token	DT_KEY_CASE
746ff6d951SJohn Birrell %token	DT_KEY_CHAR
756ff6d951SJohn Birrell %token	DT_KEY_CONST
766ff6d951SJohn Birrell %token	DT_KEY_CONTINUE
776ff6d951SJohn Birrell %token	DT_KEY_COUNTER
786ff6d951SJohn Birrell %token	DT_KEY_DEFAULT
796ff6d951SJohn Birrell %token	DT_KEY_DO
806ff6d951SJohn Birrell %token	DT_KEY_DOUBLE
816ff6d951SJohn Birrell %token	DT_KEY_ELSE
826ff6d951SJohn Birrell %token	DT_KEY_ENUM
836ff6d951SJohn Birrell %token	DT_KEY_EXTERN
846ff6d951SJohn Birrell %token	DT_KEY_FLOAT
856ff6d951SJohn Birrell %token	DT_KEY_FOR
866ff6d951SJohn Birrell %token	DT_KEY_GOTO
876ff6d951SJohn Birrell %token	DT_KEY_IF
886ff6d951SJohn Birrell %token	DT_KEY_IMPORT
896ff6d951SJohn Birrell %token	DT_KEY_INLINE
906ff6d951SJohn Birrell %token	DT_KEY_INT
916ff6d951SJohn Birrell %token	DT_KEY_LONG
926ff6d951SJohn Birrell %token	DT_KEY_PROBE
936ff6d951SJohn Birrell %token	DT_KEY_PROVIDER
946ff6d951SJohn Birrell %token	DT_KEY_REGISTER
956ff6d951SJohn Birrell %token	DT_KEY_RESTRICT
966ff6d951SJohn Birrell %token	DT_KEY_RETURN
976ff6d951SJohn Birrell %token	DT_KEY_SELF
986ff6d951SJohn Birrell %token	DT_KEY_SHORT
996ff6d951SJohn Birrell %token	DT_KEY_SIGNED
1006ff6d951SJohn Birrell %token	DT_KEY_STATIC
1016ff6d951SJohn Birrell %token	DT_KEY_STRING
1026ff6d951SJohn Birrell %token	DT_KEY_STRUCT
1036ff6d951SJohn Birrell %token	DT_KEY_SWITCH
1046ff6d951SJohn Birrell %token	DT_KEY_THIS
1056ff6d951SJohn Birrell %token	DT_KEY_TYPEDEF
1066ff6d951SJohn Birrell %token	DT_KEY_UNION
1078e648814SRui Paulo %token	DT_KEY_UNSIGNED
1086ff6d951SJohn Birrell %token	DT_KEY_USERLAND
1096ff6d951SJohn Birrell %token	DT_KEY_VOID
1106ff6d951SJohn Birrell %token	DT_KEY_VOLATILE
1116ff6d951SJohn Birrell %token	DT_KEY_WHILE
1126ff6d951SJohn Birrell %token	DT_KEY_XLATOR
1136ff6d951SJohn Birrell 
1146ff6d951SJohn Birrell %token	DT_TOK_EPRED
1156ff6d951SJohn Birrell %token	DT_CTX_DEXPR
1166ff6d951SJohn Birrell %token	DT_CTX_DPROG
1176ff6d951SJohn Birrell %token	DT_CTX_DTYPE
1186ff6d951SJohn Birrell %token	DT_TOK_EOF	0
1196ff6d951SJohn Birrell 
1206ff6d951SJohn Birrell %left	DT_TOK_COMMA
1216ff6d951SJohn Birrell %right	DT_TOK_ASGN DT_TOK_ADD_EQ DT_TOK_SUB_EQ DT_TOK_MUL_EQ DT_TOK_DIV_EQ
1226ff6d951SJohn Birrell 	DT_TOK_MOD_EQ DT_TOK_AND_EQ DT_TOK_XOR_EQ DT_TOK_OR_EQ DT_TOK_LSH_EQ
1236ff6d951SJohn Birrell 	DT_TOK_RSH_EQ
1246ff6d951SJohn Birrell %left	DT_TOK_QUESTION DT_TOK_COLON
1256ff6d951SJohn Birrell %left	DT_TOK_LOR
1266ff6d951SJohn Birrell %left	DT_TOK_LXOR
1276ff6d951SJohn Birrell %left	DT_TOK_LAND
1286ff6d951SJohn Birrell %left	DT_TOK_BOR
1296ff6d951SJohn Birrell %left	DT_TOK_XOR
1306ff6d951SJohn Birrell %left	DT_TOK_BAND
1316ff6d951SJohn Birrell %left	DT_TOK_EQU DT_TOK_NEQ
1326ff6d951SJohn Birrell %left	DT_TOK_LT DT_TOK_LE DT_TOK_GT DT_TOK_GE
1336ff6d951SJohn Birrell %left	DT_TOK_LSH DT_TOK_RSH
1346ff6d951SJohn Birrell %left	DT_TOK_ADD DT_TOK_SUB
1356ff6d951SJohn Birrell %left	DT_TOK_MUL DT_TOK_DIV DT_TOK_MOD
1366ff6d951SJohn Birrell %right	DT_TOK_LNEG DT_TOK_BNEG DT_TOK_ADDADD DT_TOK_SUBSUB
1376ff6d951SJohn Birrell 	DT_TOK_IPOS DT_TOK_INEG
1386ff6d951SJohn Birrell %right	DT_TOK_DEREF DT_TOK_ADDROF DT_TOK_SIZEOF DT_TOK_STRINGOF DT_TOK_XLATE
1396ff6d951SJohn Birrell %left	DT_TOK_LPAR DT_TOK_RPAR DT_TOK_LBRAC DT_TOK_RBRAC DT_TOK_PTR DT_TOK_DOT
1406ff6d951SJohn Birrell 
1416ff6d951SJohn Birrell %type	<l_node>	d_expression
1426ff6d951SJohn Birrell %type	<l_node>	d_program
1436ff6d951SJohn Birrell %type	<l_node>	d_type
1446ff6d951SJohn Birrell 
1456ff6d951SJohn Birrell %type	<l_node>	translation_unit
1466ff6d951SJohn Birrell %type	<l_node>	external_declaration
1476ff6d951SJohn Birrell %type	<l_node>	inline_definition
1486ff6d951SJohn Birrell %type	<l_node>	translator_definition
1496ff6d951SJohn Birrell %type	<l_node>	translator_member_list
1506ff6d951SJohn Birrell %type	<l_node>	translator_member
1516ff6d951SJohn Birrell %type	<l_node>	provider_definition
1526ff6d951SJohn Birrell %type	<l_node>	provider_probe_list
1536ff6d951SJohn Birrell %type	<l_node>	provider_probe
1546ff6d951SJohn Birrell %type	<l_node>	probe_definition
1556ff6d951SJohn Birrell %type	<l_node>	probe_specifiers
1566ff6d951SJohn Birrell %type	<l_node>	probe_specifier_list
1576ff6d951SJohn Birrell %type	<l_node>	probe_specifier
1586ff6d951SJohn Birrell %type	<l_node>	statement_list
1596ff6d951SJohn Birrell %type	<l_node>	statement_list_impl
1606ff6d951SJohn Birrell %type	<l_node>	statement_or_block
1616ff6d951SJohn Birrell %type	<l_node>	statement
1626ff6d951SJohn Birrell %type	<l_node>	declaration
1636ff6d951SJohn Birrell %type	<l_node>	init_declarator_list
1646ff6d951SJohn Birrell %type	<l_node>	init_declarator
1656ff6d951SJohn Birrell 
1666ff6d951SJohn Birrell %type	<l_decl>	type_specifier
1676ff6d951SJohn Birrell %type	<l_decl>	type_qualifier
1686ff6d951SJohn Birrell %type	<l_decl>	struct_or_union_specifier
1696ff6d951SJohn Birrell %type	<l_decl>	specifier_qualifier_list
1706ff6d951SJohn Birrell %type	<l_decl>	enum_specifier
1716ff6d951SJohn Birrell %type	<l_decl>	declarator
1726ff6d951SJohn Birrell %type	<l_decl>	direct_declarator
1736ff6d951SJohn Birrell %type	<l_decl>	pointer
1746ff6d951SJohn Birrell %type	<l_decl>	type_qualifier_list
1756ff6d951SJohn Birrell %type	<l_decl>	type_name
1766ff6d951SJohn Birrell %type	<l_decl>	abstract_declarator
1776ff6d951SJohn Birrell %type	<l_decl>	direct_abstract_declarator
1786ff6d951SJohn Birrell 
1796ff6d951SJohn Birrell %type	<l_node>	parameter_type_list
1806ff6d951SJohn Birrell %type	<l_node>	parameter_list
1816ff6d951SJohn Birrell %type	<l_node>	parameter_declaration
1826ff6d951SJohn Birrell 
1836ff6d951SJohn Birrell %type	<l_node>	array
1846ff6d951SJohn Birrell %type	<l_node>	array_parameters
1856ff6d951SJohn Birrell %type	<l_node>	function
1866ff6d951SJohn Birrell %type	<l_node>	function_parameters
1876ff6d951SJohn Birrell 
1886ff6d951SJohn Birrell %type	<l_node>	expression
1896ff6d951SJohn Birrell %type	<l_node>	assignment_expression
1906ff6d951SJohn Birrell %type	<l_node>	conditional_expression
1916ff6d951SJohn Birrell %type	<l_node>	constant_expression
1926ff6d951SJohn Birrell %type	<l_node>	logical_or_expression
1936ff6d951SJohn Birrell %type	<l_node>	logical_xor_expression
1946ff6d951SJohn Birrell %type	<l_node>	logical_and_expression
1956ff6d951SJohn Birrell %type	<l_node>	inclusive_or_expression
1966ff6d951SJohn Birrell %type	<l_node>	exclusive_or_expression
1976ff6d951SJohn Birrell %type	<l_node>	and_expression
1986ff6d951SJohn Birrell %type	<l_node>	equality_expression
1996ff6d951SJohn Birrell %type	<l_node>	relational_expression
2006ff6d951SJohn Birrell %type	<l_node>	shift_expression
2016ff6d951SJohn Birrell %type	<l_node>	additive_expression
2026ff6d951SJohn Birrell %type	<l_node>	multiplicative_expression
2036ff6d951SJohn Birrell %type	<l_node>	cast_expression
2046ff6d951SJohn Birrell %type	<l_node>	unary_expression
2056ff6d951SJohn Birrell %type	<l_node>	postfix_expression
2066ff6d951SJohn Birrell %type	<l_node>	primary_expression
2076ff6d951SJohn Birrell %type	<l_node>	argument_expression_list
2086ff6d951SJohn Birrell 
2096ff6d951SJohn Birrell %type	<l_tok>		assignment_operator
21084e874bdSMark Johnston %type	<l_tok>		unary_operator
21184e874bdSMark Johnston %type	<l_tok>		struct_or_union
2126ff6d951SJohn Birrell 
2136ff6d951SJohn Birrell %type	<l_str>		dtrace_keyword_ident
2146ff6d951SJohn Birrell 
2156ff6d951SJohn Birrell %%
2166ff6d951SJohn Birrell 
2176ff6d951SJohn Birrell dtrace_program: d_expression DT_TOK_EOF { return (dt_node_root($1)); }
2186ff6d951SJohn Birrell 	|	d_program DT_TOK_EOF { return (dt_node_root($1)); }
2196ff6d951SJohn Birrell 	|	d_type DT_TOK_EOF { return (dt_node_root($1)); }
2206ff6d951SJohn Birrell 	;
2216ff6d951SJohn Birrell 
2226ff6d951SJohn Birrell d_expression:	DT_CTX_DEXPR { $$ = NULL; }
2236ff6d951SJohn Birrell 	|	DT_CTX_DEXPR expression { $$ = $2; }
2246ff6d951SJohn Birrell 	;
2256ff6d951SJohn Birrell 
2266ff6d951SJohn Birrell d_program:	DT_CTX_DPROG { $$ = dt_node_program(NULL); }
2276ff6d951SJohn Birrell 	|	DT_CTX_DPROG translation_unit { $$ = dt_node_program($2); }
2286ff6d951SJohn Birrell 	;
2296ff6d951SJohn Birrell 
2306ff6d951SJohn Birrell d_type:		DT_CTX_DTYPE { $$ = NULL; }
2316ff6d951SJohn Birrell 	|	DT_CTX_DTYPE type_name { $$ = (dt_node_t *)$2; }
2326ff6d951SJohn Birrell 	;
2336ff6d951SJohn Birrell 
2346ff6d951SJohn Birrell translation_unit:
2356ff6d951SJohn Birrell 		external_declaration
2366ff6d951SJohn Birrell 	|	translation_unit external_declaration { $$ = LINK($1, $2); }
2376ff6d951SJohn Birrell 	;
2386ff6d951SJohn Birrell 
2396ff6d951SJohn Birrell external_declaration:
2406ff6d951SJohn Birrell 		inline_definition
2416ff6d951SJohn Birrell 	|	translator_definition
2426ff6d951SJohn Birrell 	|	provider_definition
2436ff6d951SJohn Birrell 	|	probe_definition
2446ff6d951SJohn Birrell 	|	declaration
2456ff6d951SJohn Birrell 	;
2466ff6d951SJohn Birrell 
2476ff6d951SJohn Birrell inline_definition:
2486ff6d951SJohn Birrell 		DT_KEY_INLINE declaration_specifiers declarator
2496ff6d951SJohn Birrell 		    { dt_scope_push(NULL, CTF_ERR); } DT_TOK_ASGN
2506ff6d951SJohn Birrell 		    assignment_expression ';' {
2516ff6d951SJohn Birrell 			/*
2526ff6d951SJohn Birrell 			 * We push a new declaration scope before shifting the
2536ff6d951SJohn Birrell 			 * assignment_expression in order to preserve ds_class
2546ff6d951SJohn Birrell 			 * and ds_ident for use in dt_node_inline().  Once the
2556ff6d951SJohn Birrell 			 * entire inline_definition rule is matched, pop the
2566ff6d951SJohn Birrell 			 * scope and construct the inline using the saved decl.
2576ff6d951SJohn Birrell 			 */
2586ff6d951SJohn Birrell 			dt_scope_pop();
2596ff6d951SJohn Birrell 			$$ = dt_node_inline($6);
2606ff6d951SJohn Birrell 		}
2616ff6d951SJohn Birrell 	;
2626ff6d951SJohn Birrell 
2636ff6d951SJohn Birrell translator_definition:
2646ff6d951SJohn Birrell 		DT_KEY_XLATOR type_name DT_TOK_LT type_name
2656ff6d951SJohn Birrell 		    DT_TOK_IDENT DT_TOK_GT '{' translator_member_list '}' ';' {
2666ff6d951SJohn Birrell 			$$ = dt_node_xlator($2, $4, $5, $8);
2676ff6d951SJohn Birrell 		}
2686ff6d951SJohn Birrell 	|	DT_KEY_XLATOR type_name DT_TOK_LT type_name
2696ff6d951SJohn Birrell 		    DT_TOK_IDENT DT_TOK_GT '{' '}' ';' {
2706ff6d951SJohn Birrell 			$$ = dt_node_xlator($2, $4, $5, NULL);
2716ff6d951SJohn Birrell 		}
2726ff6d951SJohn Birrell 	;
2736ff6d951SJohn Birrell 
2746ff6d951SJohn Birrell translator_member_list:
2756ff6d951SJohn Birrell 		translator_member
2766ff6d951SJohn Birrell 	|	translator_member_list translator_member { $$ = LINK($1,$2); }
2776ff6d951SJohn Birrell 	;
2786ff6d951SJohn Birrell 
2796ff6d951SJohn Birrell translator_member:
2806ff6d951SJohn Birrell 		DT_TOK_IDENT DT_TOK_ASGN assignment_expression ';' {
2816ff6d951SJohn Birrell 			$$ = dt_node_member(NULL, $1, $3);
2826ff6d951SJohn Birrell 		}
2836ff6d951SJohn Birrell 	;
2846ff6d951SJohn Birrell 
2856ff6d951SJohn Birrell provider_definition:
2866ff6d951SJohn Birrell 		DT_KEY_PROVIDER DT_TOK_IDENT '{' provider_probe_list '}' ';' {
2876ff6d951SJohn Birrell 			$$ = dt_node_provider($2, $4);
2886ff6d951SJohn Birrell 		}
2896ff6d951SJohn Birrell 	|	DT_KEY_PROVIDER DT_TOK_IDENT '{' '}' ';' {
2906ff6d951SJohn Birrell 			$$ = dt_node_provider($2, NULL);
2916ff6d951SJohn Birrell 		}
2926ff6d951SJohn Birrell 	;
2936ff6d951SJohn Birrell 
2946ff6d951SJohn Birrell provider_probe_list:
2956ff6d951SJohn Birrell 		provider_probe
2966ff6d951SJohn Birrell 	|	provider_probe_list provider_probe { $$ = LINK($1, $2); }
2976ff6d951SJohn Birrell 	;
2986ff6d951SJohn Birrell 
2996ff6d951SJohn Birrell provider_probe:
3006ff6d951SJohn Birrell 		DT_KEY_PROBE DT_TOK_IDENT function DT_TOK_COLON function ';' {
3016ff6d951SJohn Birrell 			$$ = dt_node_probe($2, 2, $3, $5);
3026ff6d951SJohn Birrell 		}
3036ff6d951SJohn Birrell 	|	DT_KEY_PROBE DT_TOK_IDENT function ';' {
3046ff6d951SJohn Birrell 			$$ = dt_node_probe($2, 1, $3, NULL);
3056ff6d951SJohn Birrell 		}
3066ff6d951SJohn Birrell 	;
3076ff6d951SJohn Birrell 
3086ff6d951SJohn Birrell 
3096ff6d951SJohn Birrell probe_definition:
3106ff6d951SJohn Birrell 		probe_specifiers {
3116ff6d951SJohn Birrell 			/*
3126ff6d951SJohn Birrell 			 * If the input stream is a file, do not permit a probe
3136ff6d951SJohn Birrell 			 * specification without / <pred> / or { <act> } after
3146ff6d951SJohn Birrell 			 * it.  This can only occur if the next token is EOF or
3156ff6d951SJohn Birrell 			 * an ambiguous predicate was slurped up as a comment.
3166ff6d951SJohn Birrell 			 * We cannot perform this check if input() is a string
3176ff6d951SJohn Birrell 			 * because dtrace(1M) [-fmnP] also use the compiler and
3186ff6d951SJohn Birrell 			 * things like dtrace -n BEGIN have to be accepted.
3196ff6d951SJohn Birrell 			 */
3206ff6d951SJohn Birrell 			if (yypcb->pcb_fileptr != NULL) {
3216ff6d951SJohn Birrell 				dnerror($1, D_SYNTAX, "expected predicate and/"
3226ff6d951SJohn Birrell 				    "or actions following probe description\n");
3236ff6d951SJohn Birrell 			}
3246ff6d951SJohn Birrell 			$$ = dt_node_clause($1, NULL, NULL);
3256ff6d951SJohn Birrell 			yybegin(YYS_CLAUSE);
3266ff6d951SJohn Birrell 		}
3276ff6d951SJohn Birrell 	|	probe_specifiers '{' statement_list '}' {
3286ff6d951SJohn Birrell 			$$ = dt_node_clause($1, NULL, $3);
3296ff6d951SJohn Birrell 			yybegin(YYS_CLAUSE);
3306ff6d951SJohn Birrell 		}
3316ff6d951SJohn Birrell 	|	probe_specifiers DT_TOK_DIV expression DT_TOK_EPRED {
3326ff6d951SJohn Birrell 			dnerror($3, D_SYNTAX, "expected actions { } following "
3336ff6d951SJohn Birrell 			    "probe description and predicate\n");
3346ff6d951SJohn Birrell 		}
3356ff6d951SJohn Birrell 	|	probe_specifiers DT_TOK_DIV expression DT_TOK_EPRED
3366ff6d951SJohn Birrell 		    '{' statement_list '}' {
3376ff6d951SJohn Birrell 			$$ = dt_node_clause($1, $3, $6);
3386ff6d951SJohn Birrell 			yybegin(YYS_CLAUSE);
3396ff6d951SJohn Birrell 		}
3406ff6d951SJohn Birrell 	;
3416ff6d951SJohn Birrell 
3426ff6d951SJohn Birrell probe_specifiers:
3436ff6d951SJohn Birrell 		probe_specifier_list { yybegin(YYS_EXPR); $$ = $1; }
3446ff6d951SJohn Birrell 	;
3456ff6d951SJohn Birrell 
3466ff6d951SJohn Birrell probe_specifier_list:
3476ff6d951SJohn Birrell 		probe_specifier
3486ff6d951SJohn Birrell 	|	probe_specifier_list DT_TOK_COMMA probe_specifier {
3496ff6d951SJohn Birrell 			$$ = LINK($1, $3);
3506ff6d951SJohn Birrell 		}
3516ff6d951SJohn Birrell 	;
3526ff6d951SJohn Birrell 
3536ff6d951SJohn Birrell probe_specifier:
3546ff6d951SJohn Birrell 		DT_TOK_PSPEC { $$ = dt_node_pdesc_by_name($1); }
3556ff6d951SJohn Birrell 	|	DT_TOK_INT   { $$ = dt_node_pdesc_by_id($1); }
3566ff6d951SJohn Birrell 	;
3576ff6d951SJohn Birrell 
3586ff6d951SJohn Birrell statement_list_impl: /* empty */ { $$ = NULL; }
3596ff6d951SJohn Birrell 	|	statement_list_impl statement { $$ = LINK($1, $2); }
3606ff6d951SJohn Birrell 	;
3616ff6d951SJohn Birrell 
3626ff6d951SJohn Birrell statement_list:
3636ff6d951SJohn Birrell 		statement_list_impl { $$ = $1; }
3646ff6d951SJohn Birrell 	|	statement_list_impl expression {
3656ff6d951SJohn Birrell 			$$ = LINK($1, dt_node_statement($2));
3666ff6d951SJohn Birrell 		}
3676ff6d951SJohn Birrell 	;
3686ff6d951SJohn Birrell 
3696ff6d951SJohn Birrell statement_or_block:
3706ff6d951SJohn Birrell 		statement
3716ff6d951SJohn Birrell 	|	'{' statement_list '}' { $$ = $2; }
3726ff6d951SJohn Birrell 
3736ff6d951SJohn Birrell statement:	';' { $$ = NULL; }
3746ff6d951SJohn Birrell 	|	expression ';' { $$ = dt_node_statement($1); }
3756ff6d951SJohn Birrell 	|	DT_KEY_IF DT_TOK_LPAR expression DT_TOK_RPAR statement_or_block {
3766ff6d951SJohn Birrell 			$$ = dt_node_if($3, $5, NULL);
3776ff6d951SJohn Birrell 		}
3786ff6d951SJohn Birrell 	|	DT_KEY_IF DT_TOK_LPAR expression DT_TOK_RPAR
3796ff6d951SJohn Birrell 		statement_or_block DT_KEY_ELSE statement_or_block {
3806ff6d951SJohn Birrell 			$$ = dt_node_if($3, $5, $7);
3816ff6d951SJohn Birrell 		}
3826ff6d951SJohn Birrell 	;
3836ff6d951SJohn Birrell 
3846ff6d951SJohn Birrell argument_expression_list:
3856ff6d951SJohn Birrell 		assignment_expression
3866ff6d951SJohn Birrell 	|	argument_expression_list DT_TOK_COMMA assignment_expression {
3876ff6d951SJohn Birrell 			$$ = LINK($1, $3);
3886ff6d951SJohn Birrell 		}
3896ff6d951SJohn Birrell 	;
3906ff6d951SJohn Birrell 
3916ff6d951SJohn Birrell primary_expression:
3926ff6d951SJohn Birrell 		DT_TOK_IDENT { $$ = dt_node_ident($1); }
3936ff6d951SJohn Birrell 	|	DT_TOK_AGG { $$ = dt_node_ident($1); }
3946ff6d951SJohn Birrell 	|	DT_TOK_INT { $$ = dt_node_int($1); }
3956ff6d951SJohn Birrell 	|	DT_TOK_STRING { $$ = dt_node_string($1); }
39684e874bdSMark Johnston 	|	DT_KEY_SELF { $$ = dt_node_ident(DUP("self")); }
39784e874bdSMark Johnston 	|	DT_KEY_THIS { $$ = dt_node_ident(DUP("this")); }
39884e874bdSMark Johnston 	|	DT_TOK_LPAR expression DT_TOK_RPAR { $$ = $2; }
3996ff6d951SJohn Birrell 	;
4006ff6d951SJohn Birrell 
4016ff6d951SJohn Birrell postfix_expression:
4026ff6d951SJohn Birrell 		primary_expression
4036ff6d951SJohn Birrell 	|	postfix_expression
4046ff6d951SJohn Birrell 		    DT_TOK_LBRAC argument_expression_list DT_TOK_RBRAC {
40584e874bdSMark Johnston 			$$ = OP2(DT_TOK_LBRAC, $1, $3);
40684e874bdSMark Johnston 		}
40784e874bdSMark Johnston 	|	postfix_expression DT_TOK_LPAR DT_TOK_RPAR {
4086ff6d951SJohn Birrell 			$$ = dt_node_func($1, NULL);
4096ff6d951SJohn Birrell 		}
4106ff6d951SJohn Birrell 	|	postfix_expression
4116ff6d951SJohn Birrell 		    DT_TOK_LPAR argument_expression_list DT_TOK_RPAR {
4126ff6d951SJohn Birrell 			$$ = dt_node_func($1, $3);
4136ff6d951SJohn Birrell 		}
4146ff6d951SJohn Birrell 	|	postfix_expression DT_TOK_DOT DT_TOK_IDENT {
4156ff6d951SJohn Birrell 			$$ = OP2(DT_TOK_DOT, $1, dt_node_ident($3));
4166ff6d951SJohn Birrell 		}
4176ff6d951SJohn Birrell 	|	postfix_expression DT_TOK_DOT DT_TOK_TNAME {
4186ff6d951SJohn Birrell 			$$ = OP2(DT_TOK_DOT, $1, dt_node_ident($3));
4196ff6d951SJohn Birrell 		}
4206ff6d951SJohn Birrell 	|	postfix_expression DT_TOK_DOT dtrace_keyword_ident {
4216ff6d951SJohn Birrell 			$$ = OP2(DT_TOK_DOT, $1, dt_node_ident($3));
42284e874bdSMark Johnston 		}
42384e874bdSMark Johnston 	|	postfix_expression DT_TOK_PTR DT_TOK_IDENT {
42484e874bdSMark Johnston 			$$ = OP2(DT_TOK_PTR, $1, dt_node_ident($3));
42584e874bdSMark Johnston 		}
4266ff6d951SJohn Birrell 	|	postfix_expression DT_TOK_PTR DT_TOK_TNAME {
4276ff6d951SJohn Birrell 			$$ = OP2(DT_TOK_PTR, $1, dt_node_ident($3));
4286ff6d951SJohn Birrell 		}
4296ff6d951SJohn Birrell 	|	postfix_expression DT_TOK_PTR dtrace_keyword_ident {
4306ff6d951SJohn Birrell 			$$ = OP2(DT_TOK_PTR, $1, dt_node_ident($3));
4316ff6d951SJohn Birrell 		}
4326ff6d951SJohn Birrell 	|	postfix_expression DT_TOK_ADDADD {
4336ff6d951SJohn Birrell 			$$ = OP1(DT_TOK_POSTINC, $1);
4346ff6d951SJohn Birrell 		}
4356ff6d951SJohn Birrell 	|	postfix_expression DT_TOK_SUBSUB {
4366ff6d951SJohn Birrell 			$$ = OP1(DT_TOK_POSTDEC, $1);
4376ff6d951SJohn Birrell 		}
4386ff6d951SJohn Birrell 	|	DT_TOK_OFFSETOF DT_TOK_LPAR type_name DT_TOK_COMMA
4396ff6d951SJohn Birrell 		    DT_TOK_IDENT DT_TOK_RPAR {
4406ff6d951SJohn Birrell 			$$ = dt_node_offsetof($3, $5);
4416ff6d951SJohn Birrell 		}
4426ff6d951SJohn Birrell 	|	DT_TOK_OFFSETOF DT_TOK_LPAR type_name DT_TOK_COMMA
4436ff6d951SJohn Birrell 		    DT_TOK_TNAME DT_TOK_RPAR {
4446ff6d951SJohn Birrell 			$$ = dt_node_offsetof($3, $5);
4456ff6d951SJohn Birrell 		}
4466ff6d951SJohn Birrell 	|	DT_TOK_OFFSETOF DT_TOK_LPAR type_name DT_TOK_COMMA
4476ff6d951SJohn Birrell 		    dtrace_keyword_ident DT_TOK_RPAR {
4486ff6d951SJohn Birrell 			$$ = dt_node_offsetof($3, $5);
4496ff6d951SJohn Birrell 		}
4506ff6d951SJohn Birrell 	|	DT_TOK_XLATE DT_TOK_LT type_name DT_TOK_GT
4516ff6d951SJohn Birrell 		    DT_TOK_LPAR expression DT_TOK_RPAR {
4526ff6d951SJohn Birrell 			$$ = OP2(DT_TOK_XLATE, dt_node_type($3), $6);
4536ff6d951SJohn Birrell 		}
4546ff6d951SJohn Birrell 	;
4556ff6d951SJohn Birrell 
4566ff6d951SJohn Birrell unary_expression:
4576ff6d951SJohn Birrell 		postfix_expression
4586ff6d951SJohn Birrell 	|	DT_TOK_ADDADD unary_expression { $$ = OP1(DT_TOK_PREINC, $2); }
4596ff6d951SJohn Birrell 	|	DT_TOK_SUBSUB unary_expression { $$ = OP1(DT_TOK_PREDEC, $2); }
4606ff6d951SJohn Birrell 	|	unary_operator cast_expression { $$ = OP1($1, $2); }
4616ff6d951SJohn Birrell 	|	DT_TOK_SIZEOF unary_expression { $$ = OP1(DT_TOK_SIZEOF, $2); }
4626ff6d951SJohn Birrell 	|	DT_TOK_SIZEOF DT_TOK_LPAR type_name DT_TOK_RPAR {
4636ff6d951SJohn Birrell 			$$ = OP1(DT_TOK_SIZEOF, dt_node_type($3));
4646ff6d951SJohn Birrell 		}
4656ff6d951SJohn Birrell 	|	DT_TOK_STRINGOF unary_expression {
4666ff6d951SJohn Birrell 			$$ = OP1(DT_TOK_STRINGOF, $2);
4676ff6d951SJohn Birrell 		}
4686ff6d951SJohn Birrell 	;
4696ff6d951SJohn Birrell 
4706ff6d951SJohn Birrell unary_operator:	DT_TOK_BAND { $$ = DT_TOK_ADDROF; }
4716ff6d951SJohn Birrell 	|	DT_TOK_MUL { $$ = DT_TOK_DEREF; }
4726ff6d951SJohn Birrell 	|	DT_TOK_ADD { $$ = DT_TOK_IPOS; }
4736ff6d951SJohn Birrell 	|	DT_TOK_SUB { $$ = DT_TOK_INEG; }
4746ff6d951SJohn Birrell 	|	DT_TOK_BNEG { $$ = DT_TOK_BNEG; }
4756ff6d951SJohn Birrell 	|	DT_TOK_LNEG { $$ = DT_TOK_LNEG; }
4766ff6d951SJohn Birrell 	;
4776ff6d951SJohn Birrell 
4786ff6d951SJohn Birrell cast_expression:
4796ff6d951SJohn Birrell 		unary_expression
4806ff6d951SJohn Birrell 	|	DT_TOK_LPAR type_name DT_TOK_RPAR cast_expression {
4816ff6d951SJohn Birrell 			$$ = OP2(DT_TOK_LPAR, dt_node_type($2), $4);
4826ff6d951SJohn Birrell 		}
4836ff6d951SJohn Birrell 	;
4846ff6d951SJohn Birrell 
4856ff6d951SJohn Birrell multiplicative_expression:
4866ff6d951SJohn Birrell 		cast_expression
4876ff6d951SJohn Birrell 	|	multiplicative_expression DT_TOK_MUL cast_expression {
4886ff6d951SJohn Birrell 			$$ = OP2(DT_TOK_MUL, $1, $3);
4896ff6d951SJohn Birrell 		}
4906ff6d951SJohn Birrell 	|	multiplicative_expression DT_TOK_DIV cast_expression {
4916ff6d951SJohn Birrell 			$$ = OP2(DT_TOK_DIV, $1, $3);
4926ff6d951SJohn Birrell 		}
4936ff6d951SJohn Birrell 	|	multiplicative_expression DT_TOK_MOD cast_expression {
4946ff6d951SJohn Birrell 			$$ = OP2(DT_TOK_MOD, $1, $3);
4956ff6d951SJohn Birrell 		}
4966ff6d951SJohn Birrell 	;
4976ff6d951SJohn Birrell 
4986ff6d951SJohn Birrell additive_expression:
4996ff6d951SJohn Birrell 		multiplicative_expression
5006ff6d951SJohn Birrell 	|	additive_expression DT_TOK_ADD multiplicative_expression {
5016ff6d951SJohn Birrell 			$$ = OP2(DT_TOK_ADD, $1, $3);
5026ff6d951SJohn Birrell 		}
5036ff6d951SJohn Birrell 	|	additive_expression DT_TOK_SUB multiplicative_expression {
5046ff6d951SJohn Birrell 			$$ = OP2(DT_TOK_SUB, $1, $3);
5056ff6d951SJohn Birrell 		}
5066ff6d951SJohn Birrell 	;
5076ff6d951SJohn Birrell 
5086ff6d951SJohn Birrell shift_expression:
5096ff6d951SJohn Birrell 		additive_expression
5106ff6d951SJohn Birrell 	|	shift_expression DT_TOK_LSH additive_expression {
5116ff6d951SJohn Birrell 			$$ = OP2(DT_TOK_LSH, $1, $3);
5126ff6d951SJohn Birrell 		}
5136ff6d951SJohn Birrell 	|	shift_expression DT_TOK_RSH additive_expression {
5146ff6d951SJohn Birrell 			$$ = OP2(DT_TOK_RSH, $1, $3);
5156ff6d951SJohn Birrell 		}
5166ff6d951SJohn Birrell 	;
5176ff6d951SJohn Birrell 
5186ff6d951SJohn Birrell relational_expression:
5196ff6d951SJohn Birrell 		shift_expression
5206ff6d951SJohn Birrell 	|	relational_expression DT_TOK_LT shift_expression {
5216ff6d951SJohn Birrell 			$$ = OP2(DT_TOK_LT, $1, $3);
5226ff6d951SJohn Birrell 		}
5236ff6d951SJohn Birrell 	|	relational_expression DT_TOK_GT shift_expression {
5246ff6d951SJohn Birrell 			$$ = OP2(DT_TOK_GT, $1, $3);
5256ff6d951SJohn Birrell 		}
5266ff6d951SJohn Birrell 	|	relational_expression DT_TOK_LE shift_expression {
5276ff6d951SJohn Birrell 			$$ = OP2(DT_TOK_LE, $1, $3);
5286ff6d951SJohn Birrell 		}
5296ff6d951SJohn Birrell 	|	relational_expression DT_TOK_GE shift_expression {
5306ff6d951SJohn Birrell 			$$ = OP2(DT_TOK_GE, $1, $3);
5316ff6d951SJohn Birrell 		}
5326ff6d951SJohn Birrell 	;
5336ff6d951SJohn Birrell 
5346ff6d951SJohn Birrell equality_expression:
5356ff6d951SJohn Birrell 		relational_expression
5366ff6d951SJohn Birrell 	|	equality_expression DT_TOK_EQU relational_expression {
5376ff6d951SJohn Birrell 			$$ = OP2(DT_TOK_EQU, $1, $3);
5386ff6d951SJohn Birrell 		}
5396ff6d951SJohn Birrell 	|	equality_expression DT_TOK_NEQ relational_expression {
5406ff6d951SJohn Birrell 			$$ = OP2(DT_TOK_NEQ, $1, $3);
5416ff6d951SJohn Birrell 		}
5426ff6d951SJohn Birrell 	;
5436ff6d951SJohn Birrell 
5446ff6d951SJohn Birrell and_expression:
5456ff6d951SJohn Birrell 		equality_expression
5466ff6d951SJohn Birrell 	|	and_expression DT_TOK_BAND equality_expression {
5476ff6d951SJohn Birrell 			$$ = OP2(DT_TOK_BAND, $1, $3);
5486ff6d951SJohn Birrell 		}
5496ff6d951SJohn Birrell 	;
5506ff6d951SJohn Birrell 
5516ff6d951SJohn Birrell exclusive_or_expression:
5526ff6d951SJohn Birrell 		and_expression
5536ff6d951SJohn Birrell 	|	exclusive_or_expression DT_TOK_XOR and_expression {
5546ff6d951SJohn Birrell 			$$ = OP2(DT_TOK_XOR, $1, $3);
5556ff6d951SJohn Birrell 		}
5566ff6d951SJohn Birrell 	;
5576ff6d951SJohn Birrell 
5586ff6d951SJohn Birrell inclusive_or_expression:
5596ff6d951SJohn Birrell 		exclusive_or_expression
5606ff6d951SJohn Birrell 	|	inclusive_or_expression DT_TOK_BOR exclusive_or_expression {
5616ff6d951SJohn Birrell 			$$ = OP2(DT_TOK_BOR, $1, $3);
5626ff6d951SJohn Birrell 		}
5636ff6d951SJohn Birrell 	;
5646ff6d951SJohn Birrell 
5656ff6d951SJohn Birrell logical_and_expression:
5666ff6d951SJohn Birrell 		inclusive_or_expression
5676ff6d951SJohn Birrell 	|	logical_and_expression DT_TOK_LAND inclusive_or_expression {
5686ff6d951SJohn Birrell 			$$ = OP2(DT_TOK_LAND, $1, $3);
5696ff6d951SJohn Birrell 		}
5706ff6d951SJohn Birrell 	;
5716ff6d951SJohn Birrell 
5726ff6d951SJohn Birrell logical_xor_expression:
5736ff6d951SJohn Birrell 		logical_and_expression
5746ff6d951SJohn Birrell 	|	logical_xor_expression DT_TOK_LXOR logical_and_expression {
5756ff6d951SJohn Birrell 			$$ = OP2(DT_TOK_LXOR, $1, $3);
5766ff6d951SJohn Birrell 		}
5776ff6d951SJohn Birrell 	;
5786ff6d951SJohn Birrell 
5796ff6d951SJohn Birrell logical_or_expression:
5806ff6d951SJohn Birrell 		logical_xor_expression
5816ff6d951SJohn Birrell 	|	logical_or_expression DT_TOK_LOR logical_xor_expression {
5826ff6d951SJohn Birrell 			$$ = OP2(DT_TOK_LOR, $1, $3);
5836ff6d951SJohn Birrell 		}
5846ff6d951SJohn Birrell 	;
5856ff6d951SJohn Birrell 
5866ff6d951SJohn Birrell constant_expression: conditional_expression
5876ff6d951SJohn Birrell 	;
5886ff6d951SJohn Birrell 
5896ff6d951SJohn Birrell conditional_expression:
5906ff6d951SJohn Birrell 		logical_or_expression
5916ff6d951SJohn Birrell 	|	logical_or_expression DT_TOK_QUESTION expression DT_TOK_COLON
5926ff6d951SJohn Birrell 		    conditional_expression { $$ = OP3($1, $3, $5); }
5936ff6d951SJohn Birrell 	;
5946ff6d951SJohn Birrell 
5956ff6d951SJohn Birrell assignment_expression:
5966ff6d951SJohn Birrell 		conditional_expression
5976ff6d951SJohn Birrell 	|	unary_expression assignment_operator assignment_expression {
5986ff6d951SJohn Birrell 			$$ = OP2($2, $1, $3);
5996ff6d951SJohn Birrell 		}
6006ff6d951SJohn Birrell 	;
6016ff6d951SJohn Birrell 
6026ff6d951SJohn Birrell assignment_operator:
6036ff6d951SJohn Birrell 		DT_TOK_ASGN   { $$ = DT_TOK_ASGN; }
6046ff6d951SJohn Birrell 	|	DT_TOK_MUL_EQ { $$ = DT_TOK_MUL_EQ; }
6056ff6d951SJohn Birrell 	|	DT_TOK_DIV_EQ { $$ = DT_TOK_DIV_EQ; }
6066ff6d951SJohn Birrell 	|	DT_TOK_MOD_EQ { $$ = DT_TOK_MOD_EQ; }
6076ff6d951SJohn Birrell 	|	DT_TOK_ADD_EQ { $$ = DT_TOK_ADD_EQ; }
6086ff6d951SJohn Birrell 	|	DT_TOK_SUB_EQ { $$ = DT_TOK_SUB_EQ; }
6096ff6d951SJohn Birrell 	|	DT_TOK_LSH_EQ { $$ = DT_TOK_LSH_EQ; }
6106ff6d951SJohn Birrell 	|	DT_TOK_RSH_EQ { $$ = DT_TOK_RSH_EQ; }
6116ff6d951SJohn Birrell 	|	DT_TOK_AND_EQ { $$ = DT_TOK_AND_EQ; }
6126ff6d951SJohn Birrell 	|	DT_TOK_XOR_EQ { $$ = DT_TOK_XOR_EQ; }
6136ff6d951SJohn Birrell 	|	DT_TOK_OR_EQ  { $$ = DT_TOK_OR_EQ; }
6146ff6d951SJohn Birrell 	;
6156ff6d951SJohn Birrell 
6166ff6d951SJohn Birrell expression:	assignment_expression
6176ff6d951SJohn Birrell 	|	expression DT_TOK_COMMA assignment_expression {
6186ff6d951SJohn Birrell 			$$ = OP2(DT_TOK_COMMA, $1, $3);
6196ff6d951SJohn Birrell 		}
6206ff6d951SJohn Birrell 	;
6216ff6d951SJohn Birrell 
6226ff6d951SJohn Birrell declaration:	declaration_specifiers ';' {
6236ff6d951SJohn Birrell 			$$ = dt_node_decl();
6246ff6d951SJohn Birrell 			dt_decl_free(dt_decl_pop());
6256ff6d951SJohn Birrell 			yybegin(YYS_CLAUSE);
6266ff6d951SJohn Birrell 		}
6276ff6d951SJohn Birrell 	|	declaration_specifiers init_declarator_list ';' {
6286ff6d951SJohn Birrell 			$$ = $2;
6296ff6d951SJohn Birrell 			dt_decl_free(dt_decl_pop());
6306ff6d951SJohn Birrell 			yybegin(YYS_CLAUSE);
6316ff6d951SJohn Birrell 		}
6326ff6d951SJohn Birrell 	;
6336ff6d951SJohn Birrell 
6346ff6d951SJohn Birrell declaration_specifiers:
6356ff6d951SJohn Birrell 		d_storage_class_specifier
6366ff6d951SJohn Birrell 	|	d_storage_class_specifier declaration_specifiers
6376ff6d951SJohn Birrell 	|	type_specifier
6386ff6d951SJohn Birrell 	|	type_specifier declaration_specifiers
6396ff6d951SJohn Birrell 	|	type_qualifier
6406ff6d951SJohn Birrell 	|	type_qualifier declaration_specifiers
6416ff6d951SJohn Birrell 	;
6426ff6d951SJohn Birrell 
6436ff6d951SJohn Birrell parameter_declaration_specifiers:
6446ff6d951SJohn Birrell 		storage_class_specifier
6456ff6d951SJohn Birrell 	|	storage_class_specifier declaration_specifiers
6466ff6d951SJohn Birrell 	|	type_specifier
6476ff6d951SJohn Birrell 	|	type_specifier declaration_specifiers
6486ff6d951SJohn Birrell 	|	type_qualifier
6496ff6d951SJohn Birrell 	|	type_qualifier declaration_specifiers
6506ff6d951SJohn Birrell 	;
6518e648814SRui Paulo 
6526ff6d951SJohn Birrell storage_class_specifier:
6536ff6d951SJohn Birrell 		DT_KEY_AUTO { dt_decl_class(DT_DC_AUTO); }
6546ff6d951SJohn Birrell 	|	DT_KEY_REGISTER { dt_decl_class(DT_DC_REGISTER); }
6556ff6d951SJohn Birrell 	|	DT_KEY_STATIC { dt_decl_class(DT_DC_STATIC); }
6566ff6d951SJohn Birrell 	|	DT_KEY_EXTERN { dt_decl_class(DT_DC_EXTERN); }
6576ff6d951SJohn Birrell 	|	DT_KEY_TYPEDEF { dt_decl_class(DT_DC_TYPEDEF); }
6586ff6d951SJohn Birrell 	;
6596ff6d951SJohn Birrell 
6606ff6d951SJohn Birrell d_storage_class_specifier:
6616ff6d951SJohn Birrell 		storage_class_specifier
6626ff6d951SJohn Birrell 	|	DT_KEY_SELF { dt_decl_class(DT_DC_SELF); }
6636ff6d951SJohn Birrell 	|	DT_KEY_THIS { dt_decl_class(DT_DC_THIS); }
6646ff6d951SJohn Birrell 	;
6656ff6d951SJohn Birrell 
6666ff6d951SJohn Birrell type_specifier:	DT_KEY_VOID { $$ = dt_decl_spec(CTF_K_INTEGER, DUP("void")); }
6676ff6d951SJohn Birrell 	|	DT_KEY_CHAR { $$ = dt_decl_spec(CTF_K_INTEGER, DUP("char")); }
6686ff6d951SJohn Birrell 	|	DT_KEY_SHORT { $$ = dt_decl_attr(DT_DA_SHORT); }
6696ff6d951SJohn Birrell 	|	DT_KEY_INT { $$ = dt_decl_spec(CTF_K_INTEGER, DUP("int")); }
6706ff6d951SJohn Birrell 	|	DT_KEY_LONG { $$ = dt_decl_attr(DT_DA_LONG); }
6716ff6d951SJohn Birrell 	|	DT_KEY_FLOAT { $$ = dt_decl_spec(CTF_K_FLOAT, DUP("float")); }
6726ff6d951SJohn Birrell 	|	DT_KEY_DOUBLE { $$ = dt_decl_spec(CTF_K_FLOAT, DUP("double")); }
6736ff6d951SJohn Birrell 	|	DT_KEY_SIGNED { $$ = dt_decl_attr(DT_DA_SIGNED); }
6746ff6d951SJohn Birrell 	|	DT_KEY_UNSIGNED { $$ = dt_decl_attr(DT_DA_UNSIGNED); }
6756ff6d951SJohn Birrell 	|	DT_KEY_USERLAND { $$ = dt_decl_attr(DT_DA_USER); }
6766ff6d951SJohn Birrell 	|	DT_KEY_STRING {
6776ff6d951SJohn Birrell 			$$ = dt_decl_spec(CTF_K_TYPEDEF, DUP("string"));
6786ff6d951SJohn Birrell 		}
6796ff6d951SJohn Birrell 	|	DT_TOK_TNAME { $$ = dt_decl_spec(CTF_K_TYPEDEF, $1); }
6806ff6d951SJohn Birrell 	|	struct_or_union_specifier
6816ff6d951SJohn Birrell 	|	enum_specifier
6826ff6d951SJohn Birrell 	;
6836ff6d951SJohn Birrell 
6846ff6d951SJohn Birrell type_qualifier:	DT_KEY_CONST { $$ = dt_decl_attr(DT_DA_CONST); }
6856ff6d951SJohn Birrell 	|	DT_KEY_RESTRICT { $$ = dt_decl_attr(DT_DA_RESTRICT); }
6866ff6d951SJohn Birrell 	|	DT_KEY_VOLATILE { $$ = dt_decl_attr(DT_DA_VOLATILE); }
6876ff6d951SJohn Birrell 	;
6886ff6d951SJohn Birrell 
6896ff6d951SJohn Birrell struct_or_union_specifier:
6906ff6d951SJohn Birrell 		struct_or_union_definition struct_declaration_list '}' {
6916ff6d951SJohn Birrell 			$$ = dt_scope_pop();
6926ff6d951SJohn Birrell 		}
6936ff6d951SJohn Birrell 	|	struct_or_union DT_TOK_IDENT { $$ = dt_decl_spec($1, $2); }
6946ff6d951SJohn Birrell 	|	struct_or_union DT_TOK_TNAME { $$ = dt_decl_spec($1, $2); }
6956ff6d951SJohn Birrell 	;
6966ff6d951SJohn Birrell 
6976ff6d951SJohn Birrell struct_or_union_definition:
6986ff6d951SJohn Birrell 		struct_or_union '{' { dt_decl_sou($1, NULL); }
6996ff6d951SJohn Birrell 	|	struct_or_union DT_TOK_IDENT '{' { dt_decl_sou($1, $2); }
7006ff6d951SJohn Birrell 	|	struct_or_union DT_TOK_TNAME '{' { dt_decl_sou($1, $2); }
7016ff6d951SJohn Birrell 	;
7026ff6d951SJohn Birrell 
7036ff6d951SJohn Birrell struct_or_union:
7046ff6d951SJohn Birrell 		DT_KEY_STRUCT { $$ = CTF_K_STRUCT; }
7056ff6d951SJohn Birrell 	|	DT_KEY_UNION { $$ = CTF_K_UNION; }
7066ff6d951SJohn Birrell 	;
7076ff6d951SJohn Birrell 
7086ff6d951SJohn Birrell struct_declaration_list:
7096ff6d951SJohn Birrell 		struct_declaration
7106ff6d951SJohn Birrell 	|	struct_declaration_list struct_declaration
7116ff6d951SJohn Birrell 	;
7126ff6d951SJohn Birrell 
7136ff6d951SJohn Birrell init_declarator_list:
7146ff6d951SJohn Birrell 		init_declarator
7156ff6d951SJohn Birrell 	|	init_declarator_list DT_TOK_COMMA init_declarator {
7166ff6d951SJohn Birrell 			$$ = LINK($1, $3);
7176ff6d951SJohn Birrell 		}
7186ff6d951SJohn Birrell 	;
7196ff6d951SJohn Birrell 
7206ff6d951SJohn Birrell init_declarator:
7216ff6d951SJohn Birrell 		declarator {
7226ff6d951SJohn Birrell 			$$ = dt_node_decl();
7236ff6d951SJohn Birrell 			dt_decl_reset();
7246ff6d951SJohn Birrell 		}
7256ff6d951SJohn Birrell 	;
7266ff6d951SJohn Birrell 
7276ff6d951SJohn Birrell struct_declaration:
7286ff6d951SJohn Birrell 		specifier_qualifier_list struct_declarator_list ';' {
7296ff6d951SJohn Birrell 			dt_decl_free(dt_decl_pop());
7306ff6d951SJohn Birrell 		}
7316ff6d951SJohn Birrell 	;
7326ff6d951SJohn Birrell 
7336ff6d951SJohn Birrell specifier_qualifier_list:
7346ff6d951SJohn Birrell 		type_specifier
7356ff6d951SJohn Birrell 	|	type_specifier specifier_qualifier_list { $$ = $2; }
7366ff6d951SJohn Birrell 	|	type_qualifier
7376ff6d951SJohn Birrell 	|	type_qualifier specifier_qualifier_list { $$ = $2; }
7386ff6d951SJohn Birrell 	;
7396ff6d951SJohn Birrell 
7406ff6d951SJohn Birrell struct_declarator_list:
7416ff6d951SJohn Birrell 		struct_declarator
7426ff6d951SJohn Birrell 	|	struct_declarator_list DT_TOK_COMMA struct_declarator
7436ff6d951SJohn Birrell 	;
7446ff6d951SJohn Birrell 
7456ff6d951SJohn Birrell struct_declarator:
7466ff6d951SJohn Birrell 		declarator { dt_decl_member(NULL); }
7476ff6d951SJohn Birrell 	|	DT_TOK_COLON constant_expression { dt_decl_member($2); }
7486ff6d951SJohn Birrell 	|	declarator DT_TOK_COLON constant_expression {
7496ff6d951SJohn Birrell 			dt_decl_member($3);
7506ff6d951SJohn Birrell 		}
7516ff6d951SJohn Birrell 	;
7526ff6d951SJohn Birrell 
7536ff6d951SJohn Birrell enum_specifier:
7546ff6d951SJohn Birrell 		enum_definition enumerator_list '}' { $$ = dt_scope_pop(); }
7556ff6d951SJohn Birrell 	|	DT_KEY_ENUM DT_TOK_IDENT { $$ = dt_decl_spec(CTF_K_ENUM, $2); }
7566ff6d951SJohn Birrell 	|	DT_KEY_ENUM DT_TOK_TNAME { $$ = dt_decl_spec(CTF_K_ENUM, $2); }
7576ff6d951SJohn Birrell 	;
7586ff6d951SJohn Birrell 
7596ff6d951SJohn Birrell enum_definition:
7606ff6d951SJohn Birrell 		DT_KEY_ENUM '{' { dt_decl_enum(NULL); }
7616ff6d951SJohn Birrell 	|	DT_KEY_ENUM DT_TOK_IDENT '{' { dt_decl_enum($2); }
7626ff6d951SJohn Birrell 	|	DT_KEY_ENUM DT_TOK_TNAME '{' { dt_decl_enum($2); }
7636ff6d951SJohn Birrell 	;
7646ff6d951SJohn Birrell 
7656ff6d951SJohn Birrell enumerator_list:
7666ff6d951SJohn Birrell 		enumerator
7676ff6d951SJohn Birrell 	|	enumerator_list DT_TOK_COMMA enumerator
7686ff6d951SJohn Birrell 	;
7696ff6d951SJohn Birrell 
7706ff6d951SJohn Birrell enumerator:	DT_TOK_IDENT { dt_decl_enumerator($1, NULL); }
7716ff6d951SJohn Birrell 	|	DT_TOK_IDENT DT_TOK_ASGN expression {
7726ff6d951SJohn Birrell 			dt_decl_enumerator($1, $3);
7736ff6d951SJohn Birrell 		}
7746ff6d951SJohn Birrell 	;
7756ff6d951SJohn Birrell 
7766ff6d951SJohn Birrell declarator:	direct_declarator
7776ff6d951SJohn Birrell 	|	pointer direct_declarator
7786ff6d951SJohn Birrell 	;
7796ff6d951SJohn Birrell 
7806ff6d951SJohn Birrell direct_declarator:
7816ff6d951SJohn Birrell 		DT_TOK_IDENT { $$ = dt_decl_ident($1); }
7826ff6d951SJohn Birrell 	|	lparen declarator DT_TOK_RPAR { $$ = $2; }
7836ff6d951SJohn Birrell 	|	direct_declarator array { dt_decl_array($2); }
7846ff6d951SJohn Birrell 	|	direct_declarator function { dt_decl_func($1, $2); }
7856ff6d951SJohn Birrell 	;
7866ff6d951SJohn Birrell 
7876ff6d951SJohn Birrell lparen:		DT_TOK_LPAR { dt_decl_top()->dd_attr |= DT_DA_PAREN; }
7886ff6d951SJohn Birrell 	;
7896ff6d951SJohn Birrell 
7906ff6d951SJohn Birrell pointer:	DT_TOK_MUL { $$ = dt_decl_ptr(); }
7916ff6d951SJohn Birrell 	|	DT_TOK_MUL type_qualifier_list { $$ = dt_decl_ptr(); }
7926ff6d951SJohn Birrell 	|	DT_TOK_MUL pointer { $$ = dt_decl_ptr(); }
7936ff6d951SJohn Birrell 	|	DT_TOK_MUL type_qualifier_list pointer { $$ = dt_decl_ptr(); }
7946ff6d951SJohn Birrell 	;
7956ff6d951SJohn Birrell 
7966ff6d951SJohn Birrell type_qualifier_list:
7976ff6d951SJohn Birrell 		type_qualifier
7986ff6d951SJohn Birrell 	|	type_qualifier_list type_qualifier { $$ = $2; }
7996ff6d951SJohn Birrell 	;
8006ff6d951SJohn Birrell 
8016ff6d951SJohn Birrell parameter_type_list:
8026ff6d951SJohn Birrell 		parameter_list
8036ff6d951SJohn Birrell 	|	DT_TOK_ELLIPSIS { $$ = dt_node_vatype(); }
8046ff6d951SJohn Birrell 	|	parameter_list DT_TOK_COMMA DT_TOK_ELLIPSIS {
8056ff6d951SJohn Birrell 			$$ = LINK($1, dt_node_vatype());
8066ff6d951SJohn Birrell 		}
8076ff6d951SJohn Birrell 	;
8086ff6d951SJohn Birrell 
8096ff6d951SJohn Birrell parameter_list:	parameter_declaration
8106ff6d951SJohn Birrell 	|	parameter_list DT_TOK_COMMA parameter_declaration {
8116ff6d951SJohn Birrell 			$$ = LINK($1, $3);
8126ff6d951SJohn Birrell 		}
8136ff6d951SJohn Birrell 	;
8146ff6d951SJohn Birrell 
8156ff6d951SJohn Birrell parameter_declaration:
8166ff6d951SJohn Birrell 		parameter_declaration_specifiers {
8176ff6d951SJohn Birrell 			$$ = dt_node_type(NULL);
8186ff6d951SJohn Birrell 		}
8196ff6d951SJohn Birrell 	|	parameter_declaration_specifiers declarator {
8206ff6d951SJohn Birrell 			$$ = dt_node_type(NULL);
8216ff6d951SJohn Birrell 		}
8226ff6d951SJohn Birrell 	|	parameter_declaration_specifiers abstract_declarator {
8236ff6d951SJohn Birrell 			$$ = dt_node_type(NULL);
8246ff6d951SJohn Birrell 		}
8256ff6d951SJohn Birrell 	;
8266ff6d951SJohn Birrell 
8276ff6d951SJohn Birrell type_name:	specifier_qualifier_list {
8286ff6d951SJohn Birrell 			$$ = dt_decl_pop();
8296ff6d951SJohn Birrell 		}
8306ff6d951SJohn Birrell 	|	specifier_qualifier_list abstract_declarator {
8316ff6d951SJohn Birrell 			$$ = dt_decl_pop();
8326ff6d951SJohn Birrell 		}
8336ff6d951SJohn Birrell 	;
8346ff6d951SJohn Birrell 
8356ff6d951SJohn Birrell abstract_declarator:
8366ff6d951SJohn Birrell 		pointer
8376ff6d951SJohn Birrell 	|	direct_abstract_declarator
8386ff6d951SJohn Birrell 	|	pointer direct_abstract_declarator
8396ff6d951SJohn Birrell 	;
8406ff6d951SJohn Birrell 
8416ff6d951SJohn Birrell direct_abstract_declarator:
8426ff6d951SJohn Birrell 		lparen abstract_declarator DT_TOK_RPAR { $$ = $2; }
8436ff6d951SJohn Birrell 	|	direct_abstract_declarator array { dt_decl_array($2); }
8446ff6d951SJohn Birrell 	|	array { dt_decl_array($1); $$ = NULL; }
8456ff6d951SJohn Birrell 	|	direct_abstract_declarator function { dt_decl_func($1, $2); }
8466ff6d951SJohn Birrell 	|	function { dt_decl_func(NULL, $1); }
8476ff6d951SJohn Birrell 	;
8486ff6d951SJohn Birrell 
8496ff6d951SJohn Birrell array:		DT_TOK_LBRAC { dt_scope_push(NULL, CTF_ERR); }
85084e874bdSMark Johnston 		    array_parameters DT_TOK_RBRAC {
85184e874bdSMark Johnston 			dt_scope_pop();
85284e874bdSMark Johnston 			$$ = $3;
85384e874bdSMark Johnston 		}
85484e874bdSMark Johnston 	;
85584e874bdSMark Johnston 
85684e874bdSMark Johnston array_parameters:
85784e874bdSMark Johnston 		/* empty */ 		{ $$ = NULL; }
85884e874bdSMark Johnston 	|	constant_expression	{ $$ = $1; }
85984e874bdSMark Johnston 	|	parameter_type_list	{ $$ = $1; }
86084e874bdSMark Johnston 	;
8616ff6d951SJohn Birrell 
862 function:	DT_TOK_LPAR { dt_scope_push(NULL, CTF_ERR); }
863 		    function_parameters DT_TOK_RPAR {
864 			dt_scope_pop();
865 			$$ = $3;
866 		}
867 	;
868 
869 function_parameters:
870 		/* empty */ 		{ $$ = NULL; }
871 	|	parameter_type_list	{ $$ = $1; }
872 	;
873 
874 dtrace_keyword_ident:
875 	  DT_KEY_PROBE { $$ = DUP("probe"); }
876 	| DT_KEY_PROVIDER { $$ = DUP("provider"); }
877 	| DT_KEY_SELF { $$ = DUP("self"); }
878 	| DT_KEY_STRING { $$ = DUP("string"); }
879 	| DT_TOK_STRINGOF { $$ = DUP("stringof"); }
880 	| DT_KEY_USERLAND { $$ = DUP("userland"); }
881 	| DT_TOK_XLATE { $$ = DUP("xlate"); }
882 	| DT_KEY_XLATOR { $$ = DUP("translator"); }
883 	;
884 
885 %%
886