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