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 */ 26*eb4db8efSMatthew Ahrens 276ab39862SRobert Mustacchi /* 28*eb4db8efSMatthew Ahrens * Copyright (c) 2014, 2016 by Delphix. All rights reserved. 296ab39862SRobert Mustacchi * Copyright (c) 2013, Joyent, Inc. All rights reserved. 306ab39862SRobert 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 1086ab39862SRobert 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 159*eb4db8efSMatthew Ahrens %type <l_node> statement_list_impl 160*eb4db8efSMatthew 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 3077c478bd9Sstevel@tonic-gate probe_definition: 3087c478bd9Sstevel@tonic-gate probe_specifiers { 3097c478bd9Sstevel@tonic-gate /* 3107c478bd9Sstevel@tonic-gate * If the input stream is a file, do not permit a probe 3117c478bd9Sstevel@tonic-gate * specification without / <pred> / or { <act> } after 3127c478bd9Sstevel@tonic-gate * it. This can only occur if the next token is EOF or 3137c478bd9Sstevel@tonic-gate * an ambiguous predicate was slurped up as a comment. 3147c478bd9Sstevel@tonic-gate * We cannot perform this check if input() is a string 3157c478bd9Sstevel@tonic-gate * because dtrace(1M) [-fmnP] also use the compiler and 3167c478bd9Sstevel@tonic-gate * things like dtrace -n BEGIN have to be accepted. 3177c478bd9Sstevel@tonic-gate */ 3187c478bd9Sstevel@tonic-gate if (yypcb->pcb_fileptr != NULL) { 3197c478bd9Sstevel@tonic-gate dnerror($1, D_SYNTAX, "expected predicate and/" 3207c478bd9Sstevel@tonic-gate "or actions following probe description\n"); 3217c478bd9Sstevel@tonic-gate } 3227c478bd9Sstevel@tonic-gate $$ = dt_node_clause($1, NULL, NULL); 323*eb4db8efSMatthew Ahrens yybegin(YYS_CLAUSE); 3247c478bd9Sstevel@tonic-gate } 3257c478bd9Sstevel@tonic-gate | probe_specifiers '{' statement_list '}' { 3267c478bd9Sstevel@tonic-gate $$ = dt_node_clause($1, NULL, $3); 327*eb4db8efSMatthew Ahrens yybegin(YYS_CLAUSE); 3287c478bd9Sstevel@tonic-gate } 3297c478bd9Sstevel@tonic-gate | probe_specifiers DT_TOK_DIV expression DT_TOK_EPRED { 3307c478bd9Sstevel@tonic-gate dnerror($3, D_SYNTAX, "expected actions { } following " 3317c478bd9Sstevel@tonic-gate "probe description and predicate\n"); 3327c478bd9Sstevel@tonic-gate } 3337c478bd9Sstevel@tonic-gate | probe_specifiers DT_TOK_DIV expression DT_TOK_EPRED 3347c478bd9Sstevel@tonic-gate '{' statement_list '}' { 3357c478bd9Sstevel@tonic-gate $$ = dt_node_clause($1, $3, $6); 336*eb4db8efSMatthew Ahrens yybegin(YYS_CLAUSE); 3377c478bd9Sstevel@tonic-gate } 3387c478bd9Sstevel@tonic-gate ; 3397c478bd9Sstevel@tonic-gate 3407c478bd9Sstevel@tonic-gate probe_specifiers: 3417c478bd9Sstevel@tonic-gate probe_specifier_list { yybegin(YYS_EXPR); $$ = $1; } 3427c478bd9Sstevel@tonic-gate ; 3437c478bd9Sstevel@tonic-gate 3447c478bd9Sstevel@tonic-gate probe_specifier_list: 3457c478bd9Sstevel@tonic-gate probe_specifier 3467c478bd9Sstevel@tonic-gate | probe_specifier_list DT_TOK_COMMA probe_specifier { 3477c478bd9Sstevel@tonic-gate $$ = LINK($1, $3); 3487c478bd9Sstevel@tonic-gate } 3497c478bd9Sstevel@tonic-gate ; 3507c478bd9Sstevel@tonic-gate 3517c478bd9Sstevel@tonic-gate probe_specifier: 3527c478bd9Sstevel@tonic-gate DT_TOK_PSPEC { $$ = dt_node_pdesc_by_name($1); } 3537c478bd9Sstevel@tonic-gate | DT_TOK_INT { $$ = dt_node_pdesc_by_id($1); } 3547c478bd9Sstevel@tonic-gate ; 3557c478bd9Sstevel@tonic-gate 356*eb4db8efSMatthew Ahrens statement_list_impl: /* empty */ { $$ = NULL; } 357*eb4db8efSMatthew Ahrens | statement_list_impl statement { $$ = LINK($1, $2); } 3587c478bd9Sstevel@tonic-gate ; 3597c478bd9Sstevel@tonic-gate 360*eb4db8efSMatthew Ahrens statement_list: 361*eb4db8efSMatthew Ahrens statement_list_impl { $$ = $1; } 362*eb4db8efSMatthew Ahrens | statement_list_impl expression { 363*eb4db8efSMatthew Ahrens $$ = LINK($1, dt_node_statement($2)); 364*eb4db8efSMatthew Ahrens } 365*eb4db8efSMatthew Ahrens ; 366*eb4db8efSMatthew Ahrens 367*eb4db8efSMatthew Ahrens statement_or_block: 368*eb4db8efSMatthew Ahrens statement 369*eb4db8efSMatthew Ahrens | '{' statement_list '}' { $$ = $2; } 370*eb4db8efSMatthew Ahrens 371*eb4db8efSMatthew Ahrens statement: ';' { $$ = NULL; } 372*eb4db8efSMatthew Ahrens | expression ';' { $$ = dt_node_statement($1); } 373*eb4db8efSMatthew Ahrens | DT_KEY_IF DT_TOK_LPAR expression DT_TOK_RPAR statement_or_block { 374*eb4db8efSMatthew Ahrens $$ = dt_node_if($3, $5, NULL); 375*eb4db8efSMatthew Ahrens } 376*eb4db8efSMatthew Ahrens | DT_KEY_IF DT_TOK_LPAR expression DT_TOK_RPAR 377*eb4db8efSMatthew Ahrens statement_or_block DT_KEY_ELSE statement_or_block { 378*eb4db8efSMatthew Ahrens $$ = dt_node_if($3, $5, $7); 379*eb4db8efSMatthew Ahrens } 3807c478bd9Sstevel@tonic-gate ; 3817c478bd9Sstevel@tonic-gate 3827c478bd9Sstevel@tonic-gate argument_expression_list: 3837c478bd9Sstevel@tonic-gate assignment_expression 3847c478bd9Sstevel@tonic-gate | argument_expression_list DT_TOK_COMMA assignment_expression { 3857c478bd9Sstevel@tonic-gate $$ = LINK($1, $3); 3867c478bd9Sstevel@tonic-gate } 3877c478bd9Sstevel@tonic-gate ; 3887c478bd9Sstevel@tonic-gate 3897c478bd9Sstevel@tonic-gate primary_expression: 3907c478bd9Sstevel@tonic-gate DT_TOK_IDENT { $$ = dt_node_ident($1); } 3917c478bd9Sstevel@tonic-gate | DT_TOK_AGG { $$ = dt_node_ident($1); } 3927c478bd9Sstevel@tonic-gate | DT_TOK_INT { $$ = dt_node_int($1); } 3937c478bd9Sstevel@tonic-gate | DT_TOK_STRING { $$ = dt_node_string($1); } 3947c478bd9Sstevel@tonic-gate | DT_KEY_SELF { $$ = dt_node_ident(DUP("self")); } 3957c478bd9Sstevel@tonic-gate | DT_KEY_THIS { $$ = dt_node_ident(DUP("this")); } 3967c478bd9Sstevel@tonic-gate | DT_TOK_LPAR expression DT_TOK_RPAR { $$ = $2; } 3977c478bd9Sstevel@tonic-gate ; 3987c478bd9Sstevel@tonic-gate 3997c478bd9Sstevel@tonic-gate postfix_expression: 4007c478bd9Sstevel@tonic-gate primary_expression 4017c478bd9Sstevel@tonic-gate | postfix_expression 4027c478bd9Sstevel@tonic-gate DT_TOK_LBRAC argument_expression_list DT_TOK_RBRAC { 4037c478bd9Sstevel@tonic-gate $$ = OP2(DT_TOK_LBRAC, $1, $3); 4047c478bd9Sstevel@tonic-gate } 4057c478bd9Sstevel@tonic-gate | postfix_expression DT_TOK_LPAR DT_TOK_RPAR { 4067c478bd9Sstevel@tonic-gate $$ = dt_node_func($1, NULL); 4077c478bd9Sstevel@tonic-gate } 4087c478bd9Sstevel@tonic-gate | postfix_expression 4097c478bd9Sstevel@tonic-gate DT_TOK_LPAR argument_expression_list DT_TOK_RPAR { 4107c478bd9Sstevel@tonic-gate $$ = dt_node_func($1, $3); 4117c478bd9Sstevel@tonic-gate } 4127c478bd9Sstevel@tonic-gate | postfix_expression DT_TOK_DOT DT_TOK_IDENT { 4137c478bd9Sstevel@tonic-gate $$ = OP2(DT_TOK_DOT, $1, dt_node_ident($3)); 4147c478bd9Sstevel@tonic-gate } 4157c478bd9Sstevel@tonic-gate | postfix_expression DT_TOK_DOT DT_TOK_TNAME { 4167c478bd9Sstevel@tonic-gate $$ = OP2(DT_TOK_DOT, $1, dt_node_ident($3)); 4177c478bd9Sstevel@tonic-gate } 4187c478bd9Sstevel@tonic-gate | postfix_expression DT_TOK_PTR DT_TOK_IDENT { 4197c478bd9Sstevel@tonic-gate $$ = OP2(DT_TOK_PTR, $1, dt_node_ident($3)); 4207c478bd9Sstevel@tonic-gate } 4217c478bd9Sstevel@tonic-gate | postfix_expression DT_TOK_PTR DT_TOK_TNAME { 4227c478bd9Sstevel@tonic-gate $$ = OP2(DT_TOK_PTR, $1, dt_node_ident($3)); 4237c478bd9Sstevel@tonic-gate } 4247c478bd9Sstevel@tonic-gate | postfix_expression DT_TOK_ADDADD { 4257c478bd9Sstevel@tonic-gate $$ = OP1(DT_TOK_POSTINC, $1); 4267c478bd9Sstevel@tonic-gate } 4277c478bd9Sstevel@tonic-gate | postfix_expression DT_TOK_SUBSUB { 4287c478bd9Sstevel@tonic-gate $$ = OP1(DT_TOK_POSTDEC, $1); 4297c478bd9Sstevel@tonic-gate } 4307c478bd9Sstevel@tonic-gate | DT_TOK_OFFSETOF DT_TOK_LPAR type_name DT_TOK_COMMA 4317c478bd9Sstevel@tonic-gate DT_TOK_IDENT DT_TOK_RPAR { 4327c478bd9Sstevel@tonic-gate $$ = dt_node_offsetof($3, $5); 4337c478bd9Sstevel@tonic-gate } 4347c478bd9Sstevel@tonic-gate | DT_TOK_OFFSETOF DT_TOK_LPAR type_name DT_TOK_COMMA 4357c478bd9Sstevel@tonic-gate DT_TOK_TNAME DT_TOK_RPAR { 4367c478bd9Sstevel@tonic-gate $$ = dt_node_offsetof($3, $5); 4377c478bd9Sstevel@tonic-gate } 4387c478bd9Sstevel@tonic-gate | DT_TOK_XLATE DT_TOK_LT type_name DT_TOK_GT 4397c478bd9Sstevel@tonic-gate DT_TOK_LPAR expression DT_TOK_RPAR { 4407c478bd9Sstevel@tonic-gate $$ = OP2(DT_TOK_XLATE, dt_node_type($3), $6); 4417c478bd9Sstevel@tonic-gate } 4427c478bd9Sstevel@tonic-gate ; 4437c478bd9Sstevel@tonic-gate 4447c478bd9Sstevel@tonic-gate unary_expression: 4457c478bd9Sstevel@tonic-gate postfix_expression 4467c478bd9Sstevel@tonic-gate | DT_TOK_ADDADD unary_expression { $$ = OP1(DT_TOK_PREINC, $2); } 4477c478bd9Sstevel@tonic-gate | DT_TOK_SUBSUB unary_expression { $$ = OP1(DT_TOK_PREDEC, $2); } 4487c478bd9Sstevel@tonic-gate | unary_operator cast_expression { $$ = OP1($1, $2); } 4497c478bd9Sstevel@tonic-gate | DT_TOK_SIZEOF unary_expression { $$ = OP1(DT_TOK_SIZEOF, $2); } 4507c478bd9Sstevel@tonic-gate | DT_TOK_SIZEOF DT_TOK_LPAR type_name DT_TOK_RPAR { 4517c478bd9Sstevel@tonic-gate $$ = OP1(DT_TOK_SIZEOF, dt_node_type($3)); 4527c478bd9Sstevel@tonic-gate } 4537c478bd9Sstevel@tonic-gate | DT_TOK_STRINGOF unary_expression { 4547c478bd9Sstevel@tonic-gate $$ = OP1(DT_TOK_STRINGOF, $2); 4557c478bd9Sstevel@tonic-gate } 4567c478bd9Sstevel@tonic-gate ; 4577c478bd9Sstevel@tonic-gate 4587c478bd9Sstevel@tonic-gate unary_operator: DT_TOK_BAND { $$ = DT_TOK_ADDROF; } 4597c478bd9Sstevel@tonic-gate | DT_TOK_MUL { $$ = DT_TOK_DEREF; } 4607c478bd9Sstevel@tonic-gate | DT_TOK_ADD { $$ = DT_TOK_IPOS; } 4617c478bd9Sstevel@tonic-gate | DT_TOK_SUB { $$ = DT_TOK_INEG; } 4627c478bd9Sstevel@tonic-gate | DT_TOK_BNEG { $$ = DT_TOK_BNEG; } 4637c478bd9Sstevel@tonic-gate | DT_TOK_LNEG { $$ = DT_TOK_LNEG; } 4647c478bd9Sstevel@tonic-gate ; 4657c478bd9Sstevel@tonic-gate 4667c478bd9Sstevel@tonic-gate cast_expression: 4677c478bd9Sstevel@tonic-gate unary_expression 4687c478bd9Sstevel@tonic-gate | DT_TOK_LPAR type_name DT_TOK_RPAR cast_expression { 4697c478bd9Sstevel@tonic-gate $$ = OP2(DT_TOK_LPAR, dt_node_type($2), $4); 4707c478bd9Sstevel@tonic-gate } 4717c478bd9Sstevel@tonic-gate ; 4727c478bd9Sstevel@tonic-gate 4737c478bd9Sstevel@tonic-gate multiplicative_expression: 4747c478bd9Sstevel@tonic-gate cast_expression 4757c478bd9Sstevel@tonic-gate | multiplicative_expression DT_TOK_MUL cast_expression { 4767c478bd9Sstevel@tonic-gate $$ = OP2(DT_TOK_MUL, $1, $3); 4777c478bd9Sstevel@tonic-gate } 4787c478bd9Sstevel@tonic-gate | multiplicative_expression DT_TOK_DIV cast_expression { 4797c478bd9Sstevel@tonic-gate $$ = OP2(DT_TOK_DIV, $1, $3); 4807c478bd9Sstevel@tonic-gate } 4817c478bd9Sstevel@tonic-gate | multiplicative_expression DT_TOK_MOD cast_expression { 4827c478bd9Sstevel@tonic-gate $$ = OP2(DT_TOK_MOD, $1, $3); 4837c478bd9Sstevel@tonic-gate } 4847c478bd9Sstevel@tonic-gate ; 4857c478bd9Sstevel@tonic-gate 4867c478bd9Sstevel@tonic-gate additive_expression: 4877c478bd9Sstevel@tonic-gate multiplicative_expression 4887c478bd9Sstevel@tonic-gate | additive_expression DT_TOK_ADD multiplicative_expression { 4897c478bd9Sstevel@tonic-gate $$ = OP2(DT_TOK_ADD, $1, $3); 4907c478bd9Sstevel@tonic-gate } 4917c478bd9Sstevel@tonic-gate | additive_expression DT_TOK_SUB multiplicative_expression { 4927c478bd9Sstevel@tonic-gate $$ = OP2(DT_TOK_SUB, $1, $3); 4937c478bd9Sstevel@tonic-gate } 4947c478bd9Sstevel@tonic-gate ; 4957c478bd9Sstevel@tonic-gate 4967c478bd9Sstevel@tonic-gate shift_expression: 4977c478bd9Sstevel@tonic-gate additive_expression 4987c478bd9Sstevel@tonic-gate | shift_expression DT_TOK_LSH additive_expression { 4997c478bd9Sstevel@tonic-gate $$ = OP2(DT_TOK_LSH, $1, $3); 5007c478bd9Sstevel@tonic-gate } 5017c478bd9Sstevel@tonic-gate | shift_expression DT_TOK_RSH additive_expression { 5027c478bd9Sstevel@tonic-gate $$ = OP2(DT_TOK_RSH, $1, $3); 5037c478bd9Sstevel@tonic-gate } 5047c478bd9Sstevel@tonic-gate ; 5057c478bd9Sstevel@tonic-gate 5067c478bd9Sstevel@tonic-gate relational_expression: 5077c478bd9Sstevel@tonic-gate shift_expression 5087c478bd9Sstevel@tonic-gate | relational_expression DT_TOK_LT shift_expression { 5097c478bd9Sstevel@tonic-gate $$ = OP2(DT_TOK_LT, $1, $3); 5107c478bd9Sstevel@tonic-gate } 5117c478bd9Sstevel@tonic-gate | relational_expression DT_TOK_GT shift_expression { 5127c478bd9Sstevel@tonic-gate $$ = OP2(DT_TOK_GT, $1, $3); 5137c478bd9Sstevel@tonic-gate } 5147c478bd9Sstevel@tonic-gate | relational_expression DT_TOK_LE shift_expression { 5157c478bd9Sstevel@tonic-gate $$ = OP2(DT_TOK_LE, $1, $3); 5167c478bd9Sstevel@tonic-gate } 5177c478bd9Sstevel@tonic-gate | relational_expression DT_TOK_GE shift_expression { 5187c478bd9Sstevel@tonic-gate $$ = OP2(DT_TOK_GE, $1, $3); 5197c478bd9Sstevel@tonic-gate } 5207c478bd9Sstevel@tonic-gate ; 5217c478bd9Sstevel@tonic-gate 5227c478bd9Sstevel@tonic-gate equality_expression: 5237c478bd9Sstevel@tonic-gate relational_expression 5247c478bd9Sstevel@tonic-gate | equality_expression DT_TOK_EQU relational_expression { 5257c478bd9Sstevel@tonic-gate $$ = OP2(DT_TOK_EQU, $1, $3); 5267c478bd9Sstevel@tonic-gate } 5277c478bd9Sstevel@tonic-gate | equality_expression DT_TOK_NEQ relational_expression { 5287c478bd9Sstevel@tonic-gate $$ = OP2(DT_TOK_NEQ, $1, $3); 5297c478bd9Sstevel@tonic-gate } 5307c478bd9Sstevel@tonic-gate ; 5317c478bd9Sstevel@tonic-gate 5327c478bd9Sstevel@tonic-gate and_expression: 5337c478bd9Sstevel@tonic-gate equality_expression 5347c478bd9Sstevel@tonic-gate | and_expression DT_TOK_BAND equality_expression { 5357c478bd9Sstevel@tonic-gate $$ = OP2(DT_TOK_BAND, $1, $3); 5367c478bd9Sstevel@tonic-gate } 5377c478bd9Sstevel@tonic-gate ; 5387c478bd9Sstevel@tonic-gate 5397c478bd9Sstevel@tonic-gate exclusive_or_expression: 5407c478bd9Sstevel@tonic-gate and_expression 5417c478bd9Sstevel@tonic-gate | exclusive_or_expression DT_TOK_XOR and_expression { 5427c478bd9Sstevel@tonic-gate $$ = OP2(DT_TOK_XOR, $1, $3); 5437c478bd9Sstevel@tonic-gate } 5447c478bd9Sstevel@tonic-gate ; 5457c478bd9Sstevel@tonic-gate 5467c478bd9Sstevel@tonic-gate inclusive_or_expression: 5477c478bd9Sstevel@tonic-gate exclusive_or_expression 5487c478bd9Sstevel@tonic-gate | inclusive_or_expression DT_TOK_BOR exclusive_or_expression { 5497c478bd9Sstevel@tonic-gate $$ = OP2(DT_TOK_BOR, $1, $3); 5507c478bd9Sstevel@tonic-gate } 5517c478bd9Sstevel@tonic-gate ; 5527c478bd9Sstevel@tonic-gate 5537c478bd9Sstevel@tonic-gate logical_and_expression: 5547c478bd9Sstevel@tonic-gate inclusive_or_expression 5557c478bd9Sstevel@tonic-gate | logical_and_expression DT_TOK_LAND inclusive_or_expression { 5567c478bd9Sstevel@tonic-gate $$ = OP2(DT_TOK_LAND, $1, $3); 5577c478bd9Sstevel@tonic-gate } 5587c478bd9Sstevel@tonic-gate ; 5597c478bd9Sstevel@tonic-gate 5607c478bd9Sstevel@tonic-gate logical_xor_expression: 5617c478bd9Sstevel@tonic-gate logical_and_expression 5627c478bd9Sstevel@tonic-gate | logical_xor_expression DT_TOK_LXOR logical_and_expression { 5637c478bd9Sstevel@tonic-gate $$ = OP2(DT_TOK_LXOR, $1, $3); 5647c478bd9Sstevel@tonic-gate } 5657c478bd9Sstevel@tonic-gate ; 5667c478bd9Sstevel@tonic-gate 5677c478bd9Sstevel@tonic-gate logical_or_expression: 5687c478bd9Sstevel@tonic-gate logical_xor_expression 5697c478bd9Sstevel@tonic-gate | logical_or_expression DT_TOK_LOR logical_xor_expression { 5707c478bd9Sstevel@tonic-gate $$ = OP2(DT_TOK_LOR, $1, $3); 5717c478bd9Sstevel@tonic-gate } 5727c478bd9Sstevel@tonic-gate ; 5737c478bd9Sstevel@tonic-gate 5747c478bd9Sstevel@tonic-gate constant_expression: conditional_expression 5757c478bd9Sstevel@tonic-gate ; 5767c478bd9Sstevel@tonic-gate 5777c478bd9Sstevel@tonic-gate conditional_expression: 5787c478bd9Sstevel@tonic-gate logical_or_expression 5797c478bd9Sstevel@tonic-gate | logical_or_expression DT_TOK_QUESTION expression DT_TOK_COLON 5807c478bd9Sstevel@tonic-gate conditional_expression { $$ = OP3($1, $3, $5); } 5817c478bd9Sstevel@tonic-gate ; 5827c478bd9Sstevel@tonic-gate 5837c478bd9Sstevel@tonic-gate assignment_expression: 5847c478bd9Sstevel@tonic-gate conditional_expression 5857c478bd9Sstevel@tonic-gate | unary_expression assignment_operator assignment_expression { 5867c478bd9Sstevel@tonic-gate $$ = OP2($2, $1, $3); 5877c478bd9Sstevel@tonic-gate } 5887c478bd9Sstevel@tonic-gate ; 5897c478bd9Sstevel@tonic-gate 5907c478bd9Sstevel@tonic-gate assignment_operator: 5917c478bd9Sstevel@tonic-gate DT_TOK_ASGN { $$ = DT_TOK_ASGN; } 5927c478bd9Sstevel@tonic-gate | DT_TOK_MUL_EQ { $$ = DT_TOK_MUL_EQ; } 5937c478bd9Sstevel@tonic-gate | DT_TOK_DIV_EQ { $$ = DT_TOK_DIV_EQ; } 5947c478bd9Sstevel@tonic-gate | DT_TOK_MOD_EQ { $$ = DT_TOK_MOD_EQ; } 5957c478bd9Sstevel@tonic-gate | DT_TOK_ADD_EQ { $$ = DT_TOK_ADD_EQ; } 5967c478bd9Sstevel@tonic-gate | DT_TOK_SUB_EQ { $$ = DT_TOK_SUB_EQ; } 5977c478bd9Sstevel@tonic-gate | DT_TOK_LSH_EQ { $$ = DT_TOK_LSH_EQ; } 5987c478bd9Sstevel@tonic-gate | DT_TOK_RSH_EQ { $$ = DT_TOK_RSH_EQ; } 5997c478bd9Sstevel@tonic-gate | DT_TOK_AND_EQ { $$ = DT_TOK_AND_EQ; } 6007c478bd9Sstevel@tonic-gate | DT_TOK_XOR_EQ { $$ = DT_TOK_XOR_EQ; } 6017c478bd9Sstevel@tonic-gate | DT_TOK_OR_EQ { $$ = DT_TOK_OR_EQ; } 6027c478bd9Sstevel@tonic-gate ; 6037c478bd9Sstevel@tonic-gate 6047c478bd9Sstevel@tonic-gate expression: assignment_expression 6057c478bd9Sstevel@tonic-gate | expression DT_TOK_COMMA assignment_expression { 6067c478bd9Sstevel@tonic-gate $$ = OP2(DT_TOK_COMMA, $1, $3); 6077c478bd9Sstevel@tonic-gate } 6087c478bd9Sstevel@tonic-gate ; 6097c478bd9Sstevel@tonic-gate 6107c478bd9Sstevel@tonic-gate declaration: declaration_specifiers ';' { 6117c478bd9Sstevel@tonic-gate $$ = dt_node_decl(); 6127c478bd9Sstevel@tonic-gate dt_decl_free(dt_decl_pop()); 6137c478bd9Sstevel@tonic-gate yybegin(YYS_CLAUSE); 6147c478bd9Sstevel@tonic-gate } 6157c478bd9Sstevel@tonic-gate | declaration_specifiers init_declarator_list ';' { 6167c478bd9Sstevel@tonic-gate $$ = $2; 6177c478bd9Sstevel@tonic-gate dt_decl_free(dt_decl_pop()); 6187c478bd9Sstevel@tonic-gate yybegin(YYS_CLAUSE); 6197c478bd9Sstevel@tonic-gate } 6207c478bd9Sstevel@tonic-gate ; 6217c478bd9Sstevel@tonic-gate 6227c478bd9Sstevel@tonic-gate declaration_specifiers: 6237c478bd9Sstevel@tonic-gate d_storage_class_specifier 6247c478bd9Sstevel@tonic-gate | d_storage_class_specifier declaration_specifiers 6257c478bd9Sstevel@tonic-gate | type_specifier 6267c478bd9Sstevel@tonic-gate | type_specifier declaration_specifiers 6277c478bd9Sstevel@tonic-gate | type_qualifier 6287c478bd9Sstevel@tonic-gate | type_qualifier declaration_specifiers 6297c478bd9Sstevel@tonic-gate ; 6307c478bd9Sstevel@tonic-gate 6317c478bd9Sstevel@tonic-gate parameter_declaration_specifiers: 6327c478bd9Sstevel@tonic-gate storage_class_specifier 6337c478bd9Sstevel@tonic-gate | storage_class_specifier declaration_specifiers 6347c478bd9Sstevel@tonic-gate | type_specifier 6357c478bd9Sstevel@tonic-gate | type_specifier declaration_specifiers 6367c478bd9Sstevel@tonic-gate | type_qualifier 6377c478bd9Sstevel@tonic-gate | type_qualifier declaration_specifiers 6387c478bd9Sstevel@tonic-gate ; 6397c478bd9Sstevel@tonic-gate 6407c478bd9Sstevel@tonic-gate storage_class_specifier: 6417c478bd9Sstevel@tonic-gate DT_KEY_AUTO { dt_decl_class(DT_DC_AUTO); } 6427c478bd9Sstevel@tonic-gate | DT_KEY_REGISTER { dt_decl_class(DT_DC_REGISTER); } 6437c478bd9Sstevel@tonic-gate | DT_KEY_STATIC { dt_decl_class(DT_DC_STATIC); } 6447c478bd9Sstevel@tonic-gate | DT_KEY_EXTERN { dt_decl_class(DT_DC_EXTERN); } 6457c478bd9Sstevel@tonic-gate | DT_KEY_TYPEDEF { dt_decl_class(DT_DC_TYPEDEF); } 6467c478bd9Sstevel@tonic-gate ; 6477c478bd9Sstevel@tonic-gate 6487c478bd9Sstevel@tonic-gate d_storage_class_specifier: 6497c478bd9Sstevel@tonic-gate storage_class_specifier 6507c478bd9Sstevel@tonic-gate | DT_KEY_SELF { dt_decl_class(DT_DC_SELF); } 6517c478bd9Sstevel@tonic-gate | DT_KEY_THIS { dt_decl_class(DT_DC_THIS); } 6527c478bd9Sstevel@tonic-gate ; 6537c478bd9Sstevel@tonic-gate 6547c478bd9Sstevel@tonic-gate type_specifier: DT_KEY_VOID { $$ = dt_decl_spec(CTF_K_INTEGER, DUP("void")); } 6557c478bd9Sstevel@tonic-gate | DT_KEY_CHAR { $$ = dt_decl_spec(CTF_K_INTEGER, DUP("char")); } 6567c478bd9Sstevel@tonic-gate | DT_KEY_SHORT { $$ = dt_decl_attr(DT_DA_SHORT); } 6577c478bd9Sstevel@tonic-gate | DT_KEY_INT { $$ = dt_decl_spec(CTF_K_INTEGER, DUP("int")); } 6587c478bd9Sstevel@tonic-gate | DT_KEY_LONG { $$ = dt_decl_attr(DT_DA_LONG); } 6597c478bd9Sstevel@tonic-gate | DT_KEY_FLOAT { $$ = dt_decl_spec(CTF_K_FLOAT, DUP("float")); } 6607c478bd9Sstevel@tonic-gate | DT_KEY_DOUBLE { $$ = dt_decl_spec(CTF_K_FLOAT, DUP("double")); } 6617c478bd9Sstevel@tonic-gate | DT_KEY_SIGNED { $$ = dt_decl_attr(DT_DA_SIGNED); } 6627c478bd9Sstevel@tonic-gate | DT_KEY_UNSIGNED { $$ = dt_decl_attr(DT_DA_UNSIGNED); } 6636ab39862SRobert Mustacchi | DT_KEY_USERLAND { $$ = dt_decl_attr(DT_DA_USER); } 6647c478bd9Sstevel@tonic-gate | DT_KEY_STRING { 6657c478bd9Sstevel@tonic-gate $$ = dt_decl_spec(CTF_K_TYPEDEF, DUP("string")); 6667c478bd9Sstevel@tonic-gate } 6677c478bd9Sstevel@tonic-gate | DT_TOK_TNAME { $$ = dt_decl_spec(CTF_K_TYPEDEF, $1); } 6687c478bd9Sstevel@tonic-gate | struct_or_union_specifier 6697c478bd9Sstevel@tonic-gate | enum_specifier 6707c478bd9Sstevel@tonic-gate ; 6717c478bd9Sstevel@tonic-gate 6727c478bd9Sstevel@tonic-gate type_qualifier: DT_KEY_CONST { $$ = dt_decl_attr(DT_DA_CONST); } 6737c478bd9Sstevel@tonic-gate | DT_KEY_RESTRICT { $$ = dt_decl_attr(DT_DA_RESTRICT); } 6747c478bd9Sstevel@tonic-gate | DT_KEY_VOLATILE { $$ = dt_decl_attr(DT_DA_VOLATILE); } 6757c478bd9Sstevel@tonic-gate ; 6767c478bd9Sstevel@tonic-gate 6777c478bd9Sstevel@tonic-gate struct_or_union_specifier: 6787c478bd9Sstevel@tonic-gate struct_or_union_definition struct_declaration_list '}' { 6797c478bd9Sstevel@tonic-gate $$ = dt_scope_pop(); 6807c478bd9Sstevel@tonic-gate } 6817c478bd9Sstevel@tonic-gate | struct_or_union DT_TOK_IDENT { $$ = dt_decl_spec($1, $2); } 6827c478bd9Sstevel@tonic-gate | struct_or_union DT_TOK_TNAME { $$ = dt_decl_spec($1, $2); } 6837c478bd9Sstevel@tonic-gate ; 6847c478bd9Sstevel@tonic-gate 6857c478bd9Sstevel@tonic-gate struct_or_union_definition: 6867c478bd9Sstevel@tonic-gate struct_or_union '{' { dt_decl_sou($1, NULL); } 6877c478bd9Sstevel@tonic-gate | struct_or_union DT_TOK_IDENT '{' { dt_decl_sou($1, $2); } 6887c478bd9Sstevel@tonic-gate | struct_or_union DT_TOK_TNAME '{' { dt_decl_sou($1, $2); } 6897c478bd9Sstevel@tonic-gate ; 6907c478bd9Sstevel@tonic-gate 6917c478bd9Sstevel@tonic-gate struct_or_union: 6927c478bd9Sstevel@tonic-gate DT_KEY_STRUCT { $$ = CTF_K_STRUCT; } 6937c478bd9Sstevel@tonic-gate | DT_KEY_UNION { $$ = CTF_K_UNION; } 6947c478bd9Sstevel@tonic-gate ; 6957c478bd9Sstevel@tonic-gate 6967c478bd9Sstevel@tonic-gate struct_declaration_list: 6977c478bd9Sstevel@tonic-gate struct_declaration 6987c478bd9Sstevel@tonic-gate | struct_declaration_list struct_declaration 6997c478bd9Sstevel@tonic-gate ; 7007c478bd9Sstevel@tonic-gate 7017c478bd9Sstevel@tonic-gate init_declarator_list: 7027c478bd9Sstevel@tonic-gate init_declarator 7037c478bd9Sstevel@tonic-gate | init_declarator_list DT_TOK_COMMA init_declarator { 7047c478bd9Sstevel@tonic-gate $$ = LINK($1, $3); 7057c478bd9Sstevel@tonic-gate } 7067c478bd9Sstevel@tonic-gate ; 7077c478bd9Sstevel@tonic-gate 7087c478bd9Sstevel@tonic-gate init_declarator: 7097c478bd9Sstevel@tonic-gate declarator { 7107c478bd9Sstevel@tonic-gate $$ = dt_node_decl(); 7117c478bd9Sstevel@tonic-gate dt_decl_reset(); 7127c478bd9Sstevel@tonic-gate } 7137c478bd9Sstevel@tonic-gate ; 7147c478bd9Sstevel@tonic-gate 7157c478bd9Sstevel@tonic-gate struct_declaration: 7167c478bd9Sstevel@tonic-gate specifier_qualifier_list struct_declarator_list ';' { 7177c478bd9Sstevel@tonic-gate dt_decl_free(dt_decl_pop()); 7187c478bd9Sstevel@tonic-gate } 7197c478bd9Sstevel@tonic-gate ; 7207c478bd9Sstevel@tonic-gate 7217c478bd9Sstevel@tonic-gate specifier_qualifier_list: 7227c478bd9Sstevel@tonic-gate type_specifier 7237c478bd9Sstevel@tonic-gate | type_specifier specifier_qualifier_list { $$ = $2; } 7247c478bd9Sstevel@tonic-gate | type_qualifier 7257c478bd9Sstevel@tonic-gate | type_qualifier specifier_qualifier_list { $$ = $2; } 7267c478bd9Sstevel@tonic-gate ; 7277c478bd9Sstevel@tonic-gate 7287c478bd9Sstevel@tonic-gate struct_declarator_list: 7297c478bd9Sstevel@tonic-gate struct_declarator 7307c478bd9Sstevel@tonic-gate | struct_declarator_list DT_TOK_COMMA struct_declarator 7317c478bd9Sstevel@tonic-gate ; 7327c478bd9Sstevel@tonic-gate 7337c478bd9Sstevel@tonic-gate struct_declarator: 7347c478bd9Sstevel@tonic-gate declarator { dt_decl_member(NULL); } 7357c478bd9Sstevel@tonic-gate | DT_TOK_COLON constant_expression { dt_decl_member($2); } 7367c478bd9Sstevel@tonic-gate | declarator DT_TOK_COLON constant_expression { 7377c478bd9Sstevel@tonic-gate dt_decl_member($3); 7387c478bd9Sstevel@tonic-gate } 7397c478bd9Sstevel@tonic-gate ; 7407c478bd9Sstevel@tonic-gate 7417c478bd9Sstevel@tonic-gate enum_specifier: 7427c478bd9Sstevel@tonic-gate enum_definition enumerator_list '}' { $$ = 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: 845e4586ebfSmws /* 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: 858e4586ebfSmws /* empty */ { $$ = NULL; } 859e4586ebfSmws | parameter_type_list { $$ = $1; } 860e4586ebfSmws ; 861e4586ebfSmws 8627c478bd9Sstevel@tonic-gate %% 863