Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1 | // Copyright 2009 The Go Authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style |
| 3 | // license that can be found in the LICENSE file. |
| 4 | |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 5 | /* |
| 6 | * Go language grammar. |
| 7 | * |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 8 | * The Go semicolon rules are: |
| 9 | * |
| 10 | * 1. all statements and declarations are terminated by semicolons |
Russ Cox | 3997495 | 2009-12-11 15:59:41 -0800 | [diff] [blame^] | 11 | * 2. semicolons can be omitted before and after the closing ) or } |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 12 | * on a list of statements or declarations. |
Russ Cox | 3997495 | 2009-12-11 15:59:41 -0800 | [diff] [blame^] | 13 | * 3. semicolons are inserted by the lexer before a newline |
| 14 | * following a specific list of tokens. |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 15 | * |
Russ Cox | 3997495 | 2009-12-11 15:59:41 -0800 | [diff] [blame^] | 16 | * Rules #1 and #2 are accomplished by writing the lists as |
| 17 | * semicolon-separated lists with an optional trailing semicolon. |
| 18 | * Rule #3 is implemented in yylex. |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 19 | */ |
| 20 | |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 21 | %{ |
Russ Cox | 593ccd1 | 2009-11-12 23:38:48 -0800 | [diff] [blame] | 22 | #include <stdio.h> /* if we don't, bison will, and go.h re-#defines getc */ |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 23 | #include "go.h" |
| 24 | %} |
| 25 | %union { |
| 26 | Node* node; |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 27 | NodeList* list; |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 28 | Type* type; |
| 29 | Sym* sym; |
| 30 | struct Val val; |
| 31 | int lint; |
| 32 | } |
Ken Thompson | a8a9dbc | 2008-08-11 19:17:28 -0700 | [diff] [blame] | 33 | |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 34 | // |sed 's/.* //' |9 fmt -l1 |sort |9 fmt -l50 | sed 's/^/%xxx /' |
| 35 | |
| 36 | %token <val> LLITERAL |
| 37 | %token <lint> LASOP |
| 38 | %token <sym> LBREAK LCASE LCHAN LCOLAS LCONST LCONTINUE LDDD |
| 39 | %token <sym> LDEFAULT LDEFER LELSE LFALL LFOR LFUNC LGO LGOTO |
| 40 | %token <sym> LIF LIMPORT LINTERFACE LMAKE LMAP LNAME LNEW |
| 41 | %token <sym> LPACKAGE LRANGE LRETURN LSELECT LSTRUCT LSWITCH |
| 42 | %token <sym> LTYPE LVAR |
| 43 | |
| 44 | %token LANDAND LANDNOT LBODY LCOMM LDEC LEQ LGE LGT |
| 45 | %token LIGNORE LINC LLE LLSH LLT LNE LOROR LRSH |
Russ Cox | 8abcdee | 2009-06-06 19:27:48 -0700 | [diff] [blame] | 46 | %token LSEMIBRACE |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 47 | |
Russ Cox | 38df5ec | 2009-08-19 15:18:08 -0700 | [diff] [blame] | 48 | %type <lint> lbrace import_here |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 49 | %type <sym> sym packname |
| 50 | %type <val> oliteral |
| 51 | |
Russ Cox | be16caf | 2009-07-13 23:38:39 -0700 | [diff] [blame] | 52 | %type <node> stmt ntype |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 53 | %type <node> arg_type |
| 54 | %type <node> case caseblock |
| 55 | %type <node> compound_stmt dotname embed expr |
| 56 | %type <node> expr_or_type |
| 57 | %type <node> fndcl fnliteral |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 58 | %type <node> for_body for_header for_stmt if_header if_stmt |
Russ Cox | 7743ffe | 2009-09-28 14:05:34 -0700 | [diff] [blame] | 59 | %type <node> interfacedcl keyval labelname name |
Russ Cox | 35e5906 | 2009-07-17 14:42:14 -0700 | [diff] [blame] | 60 | %type <node> name_or_type non_expr_type |
Russ Cox | b648716 | 2009-08-07 12:50:26 -0700 | [diff] [blame] | 61 | %type <node> new_name dcl_name oexpr typedclname |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 62 | %type <node> onew_name |
| 63 | %type <node> osimple_stmt pexpr |
Russ Cox | 8abcdee | 2009-06-06 19:27:48 -0700 | [diff] [blame] | 64 | %type <node> pseudocall range_stmt select_stmt |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 65 | %type <node> simple_stmt |
| 66 | %type <node> switch_stmt uexpr |
Russ Cox | db508ccbf | 2009-07-17 13:38:16 -0700 | [diff] [blame] | 67 | %type <node> xfndcl typedcl |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 68 | |
Russ Cox | db508ccbf | 2009-07-17 13:38:16 -0700 | [diff] [blame] | 69 | %type <list> xdcl fnbody fnres switch_body loop_body dcl_name_list |
| 70 | %type <list> new_name_list expr_list keyval_list braced_keyval_list expr_or_type_list xdcl_list |
Russ Cox | 3997495 | 2009-12-11 15:59:41 -0800 | [diff] [blame^] | 71 | %type <list> oexpr_list oexpr_or_type_list_ocomma caseblock_list stmt_list oarg_type_list_ocomma arg_type_list |
Russ Cox | 7743ffe | 2009-09-28 14:05:34 -0700 | [diff] [blame] | 72 | %type <list> interfacedcl_list vardcl vardcl_list structdcl structdcl_list |
Russ Cox | db508ccbf | 2009-07-17 13:38:16 -0700 | [diff] [blame] | 73 | %type <list> common_dcl constdcl constdcl1 constdcl_list typedcl_list |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 74 | |
Russ Cox | 6f16987 | 2009-09-29 21:21:14 -0700 | [diff] [blame] | 75 | %type <node> convtype dotdotdot |
Russ Cox | 35e5906 | 2009-07-17 14:42:14 -0700 | [diff] [blame] | 76 | %type <node> indcl interfacetype structtype ptrtype |
Russ Cox | b648716 | 2009-08-07 12:50:26 -0700 | [diff] [blame] | 77 | %type <node> chantype non_chan_type othertype non_fn_type fntype |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 78 | |
| 79 | %type <sym> hidden_importsym hidden_pkg_importsym |
| 80 | |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 81 | %type <node> hidden_constant hidden_dcl hidden_interfacedcl hidden_structdcl |
| 82 | |
| 83 | %type <list> hidden_funres |
| 84 | %type <list> ohidden_funres |
| 85 | %type <list> hidden_funarg_list ohidden_funarg_list |
| 86 | %type <list> hidden_interfacedcl_list ohidden_interfacedcl_list |
| 87 | %type <list> hidden_structdcl_list ohidden_structdcl_list |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 88 | |
Russ Cox | e733766 | 2009-12-03 00:10:32 -0800 | [diff] [blame] | 89 | %type <type> hidden_type hidden_type_misc hidden_pkgtype |
| 90 | %type <type> hidden_type_func hidden_type_non_func |
| 91 | %type <type> hidden_type_chan hidden_type_non_chan |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 92 | |
| 93 | %left LOROR |
| 94 | %left LANDAND |
| 95 | %left LCOMM |
| 96 | %left LEQ LNE LLE LGE LLT LGT |
| 97 | %left '+' '-' '|' '^' |
| 98 | %left '*' '/' '%' '&' LLSH LRSH LANDNOT |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 99 | |
Russ Cox | d364d28 | 2008-10-07 12:36:30 -0700 | [diff] [blame] | 100 | /* |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 101 | * manual override of shift/reduce conflicts. |
| 102 | * the general form is that we assign a precedence |
| 103 | * to the token being shifted and then introduce |
| 104 | * NotToken with lower precedence or PreferToToken with higher |
| 105 | * and annotate the reducing rule accordingly. |
Russ Cox | d364d28 | 2008-10-07 12:36:30 -0700 | [diff] [blame] | 106 | */ |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 107 | %left NotPackage |
| 108 | %left LPACKAGE |
Russ Cox | d364d28 | 2008-10-07 12:36:30 -0700 | [diff] [blame] | 109 | |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 110 | %left NotParen |
| 111 | %left '(' |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 112 | |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 113 | %left ')' |
| 114 | %left PreferToRightParen |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 115 | |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 116 | %% |
| 117 | file: |
Russ Cox | b3533df | 2009-05-08 15:40:31 -0700 | [diff] [blame] | 118 | loadsys |
| 119 | package |
| 120 | imports |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 121 | xdcl_list |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 122 | { |
Russ Cox | 66bb399 | 2009-08-12 13:18:19 -0700 | [diff] [blame] | 123 | xtop = concat(xtop, $4); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 124 | } |
| 125 | |
| 126 | package: |
Russ Cox | 63985b4 | 2009-03-05 15:57:03 -0800 | [diff] [blame] | 127 | %prec NotPackage |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 128 | { |
Russ Cox | 38df5ec | 2009-08-19 15:18:08 -0700 | [diff] [blame] | 129 | prevlineno = lineno; |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 130 | yyerror("package statement must be first"); |
Russ Cox | 3997495 | 2009-12-11 15:59:41 -0800 | [diff] [blame^] | 131 | flusherrors(); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 132 | mkpackage("main"); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 133 | } |
Russ Cox | 3997495 | 2009-12-11 15:59:41 -0800 | [diff] [blame^] | 134 | | LPACKAGE sym ';' |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 135 | { |
| 136 | mkpackage($2->name); |
Russ Cox | b3533df | 2009-05-08 15:40:31 -0700 | [diff] [blame] | 137 | } |
| 138 | |
| 139 | /* |
Russ Cox | 22a5c78 | 2009-10-15 23:10:49 -0700 | [diff] [blame] | 140 | * this loads the definitions for the low-level runtime functions, |
Russ Cox | b3533df | 2009-05-08 15:40:31 -0700 | [diff] [blame] | 141 | * so that the compiler can generate calls to them, |
Russ Cox | 22a5c78 | 2009-10-15 23:10:49 -0700 | [diff] [blame] | 142 | * but does not make the name "runtime" visible as a package. |
Russ Cox | b3533df | 2009-05-08 15:40:31 -0700 | [diff] [blame] | 143 | */ |
| 144 | loadsys: |
| 145 | { |
Russ Cox | 22a5c78 | 2009-10-15 23:10:49 -0700 | [diff] [blame] | 146 | cannedimports("runtime.builtin", runtimeimport); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 147 | } |
Russ Cox | b3533df | 2009-05-08 15:40:31 -0700 | [diff] [blame] | 148 | import_package |
| 149 | import_there |
| 150 | { |
| 151 | pkgimportname = S; |
| 152 | } |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 153 | |
| 154 | imports: |
Russ Cox | 3997495 | 2009-12-11 15:59:41 -0800 | [diff] [blame^] | 155 | | imports import ';' |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 156 | |
| 157 | import: |
Russ Cox | 3997495 | 2009-12-11 15:59:41 -0800 | [diff] [blame^] | 158 | LIMPORT import_stmt |
| 159 | | LIMPORT '(' import_stmt_list osemi ')' |
| 160 | | LIMPORT '(' ')' |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 161 | |
| 162 | import_stmt: |
Russ Cox | 38df5ec | 2009-08-19 15:18:08 -0700 | [diff] [blame] | 163 | import_here import_package import_there |
Russ Cox | b3533df | 2009-05-08 15:40:31 -0700 | [diff] [blame] | 164 | { |
| 165 | Sym *import, *my; |
Russ Cox | 73e52ae | 2009-09-17 16:42:10 -0700 | [diff] [blame] | 166 | Node *pack; |
Russ Cox | b3533df | 2009-05-08 15:40:31 -0700 | [diff] [blame] | 167 | |
| 168 | import = pkgimportname; |
| 169 | my = pkgmyname; |
| 170 | pkgmyname = S; |
| 171 | pkgimportname = S; |
| 172 | |
| 173 | if(import == S) |
| 174 | break; |
Russ Cox | 73e52ae | 2009-09-17 16:42:10 -0700 | [diff] [blame] | 175 | |
| 176 | pack = nod(OPACK, N, N); |
| 177 | pack->sym = import; |
| 178 | pack->lineno = $1; |
Russ Cox | 73e52ae | 2009-09-17 16:42:10 -0700 | [diff] [blame] | 179 | |
Russ Cox | b3533df | 2009-05-08 15:40:31 -0700 | [diff] [blame] | 180 | if(my == S) |
| 181 | my = import; |
| 182 | if(my->name[0] == '.') { |
Russ Cox | 73e52ae | 2009-09-17 16:42:10 -0700 | [diff] [blame] | 183 | importdot(import, pack); |
Russ Cox | b3533df | 2009-05-08 15:40:31 -0700 | [diff] [blame] | 184 | break; |
| 185 | } |
Russ Cox | aa6e81dd | 2009-09-09 16:59:41 -0700 | [diff] [blame] | 186 | if(my->name[0] == '_' && my->name[1] == '\0') |
| 187 | break; |
Russ Cox | b3533df | 2009-05-08 15:40:31 -0700 | [diff] [blame] | 188 | |
Russ Cox | fd76b4f | 2009-10-12 10:12:37 -0700 | [diff] [blame] | 189 | // Can end up with my->def->op set to ONONAME |
| 190 | // if one package refers to p without importing it. |
| 191 | // Don't want to give an error on a good import |
| 192 | // in another file. |
| 193 | if(my->def && my->def->op != ONONAME) { |
Russ Cox | d515063 | 2009-10-07 14:55:12 -0700 | [diff] [blame] | 194 | lineno = $1; |
| 195 | redeclare(my, "as imported package name"); |
| 196 | } |
Russ Cox | 73e52ae | 2009-09-17 16:42:10 -0700 | [diff] [blame] | 197 | my->def = pack; |
Russ Cox | 38df5ec | 2009-08-19 15:18:08 -0700 | [diff] [blame] | 198 | my->lastlineno = $1; |
Russ Cox | 5600435 | 2009-08-19 17:27:08 -0700 | [diff] [blame] | 199 | import->block = 1; // at top level |
Russ Cox | b3533df | 2009-05-08 15:40:31 -0700 | [diff] [blame] | 200 | } |
Russ Cox | 5d16d23 | 2009-09-09 00:18:16 -0700 | [diff] [blame] | 201 | |
Russ Cox | 38df5ec | 2009-08-19 15:18:08 -0700 | [diff] [blame] | 202 | |
| 203 | import_stmt_list: |
| 204 | import_stmt |
| 205 | | import_stmt_list ';' import_stmt |
| 206 | |
| 207 | import_here: |
| 208 | LLITERAL |
| 209 | { |
| 210 | // import with original name |
| 211 | $$ = parserline(); |
| 212 | pkgimportname = S; |
| 213 | pkgmyname = S; |
Russ Cox | 73e52ae | 2009-09-17 16:42:10 -0700 | [diff] [blame] | 214 | importfile(&$1, $$); |
Russ Cox | 38df5ec | 2009-08-19 15:18:08 -0700 | [diff] [blame] | 215 | } |
| 216 | | sym LLITERAL |
| 217 | { |
| 218 | // import with given name |
| 219 | $$ = parserline(); |
| 220 | pkgimportname = S; |
| 221 | pkgmyname = $1; |
Russ Cox | 73e52ae | 2009-09-17 16:42:10 -0700 | [diff] [blame] | 222 | importfile(&$2, $$); |
Russ Cox | 38df5ec | 2009-08-19 15:18:08 -0700 | [diff] [blame] | 223 | } |
| 224 | | '.' LLITERAL |
| 225 | { |
| 226 | // import into my name space |
| 227 | $$ = parserline(); |
| 228 | pkgmyname = lookup("."); |
Russ Cox | 73e52ae | 2009-09-17 16:42:10 -0700 | [diff] [blame] | 229 | importfile(&$2, $$); |
Russ Cox | 38df5ec | 2009-08-19 15:18:08 -0700 | [diff] [blame] | 230 | } |
| 231 | |
| 232 | import_package: |
Russ Cox | 3997495 | 2009-12-11 15:59:41 -0800 | [diff] [blame^] | 233 | LPACKAGE sym ';' |
Russ Cox | 38df5ec | 2009-08-19 15:18:08 -0700 | [diff] [blame] | 234 | { |
| 235 | pkgimportname = $2; |
| 236 | if(strcmp($2->name, "main") == 0) |
| 237 | yyerror("cannot import package main"); |
Russ Cox | 5d16d23 | 2009-09-09 00:18:16 -0700 | [diff] [blame] | 238 | |
Russ Cox | 9f42ccb | 2009-11-09 15:25:18 -0800 | [diff] [blame] | 239 | // TODO(rsc): This should go away once we get |
| 240 | // rid of the global package name space. |
Russ Cox | 22a5c78 | 2009-10-15 23:10:49 -0700 | [diff] [blame] | 241 | if(strcmp($2->name, package) == 0 && strcmp(package, "runtime") != 0) |
Russ Cox | 9f42ccb | 2009-11-09 15:25:18 -0800 | [diff] [blame] | 242 | yyerror("package cannot import itself"); |
Russ Cox | 38df5ec | 2009-08-19 15:18:08 -0700 | [diff] [blame] | 243 | } |
| 244 | |
| 245 | import_there: |
| 246 | { |
| 247 | defercheckwidth(); |
| 248 | } |
| 249 | hidden_import_list '$' '$' |
| 250 | { |
| 251 | resumecheckwidth(); |
| 252 | checkimports(); |
| 253 | unimportfile(); |
| 254 | } |
| 255 | | LIMPORT '$' '$' |
| 256 | { |
| 257 | defercheckwidth(); |
| 258 | } |
| 259 | hidden_import_list '$' '$' |
| 260 | { |
| 261 | resumecheckwidth(); |
| 262 | checkimports(); |
Russ Cox | 3997495 | 2009-12-11 15:59:41 -0800 | [diff] [blame^] | 263 | unimportfile(); |
Russ Cox | 38df5ec | 2009-08-19 15:18:08 -0700 | [diff] [blame] | 264 | } |
Russ Cox | b3533df | 2009-05-08 15:40:31 -0700 | [diff] [blame] | 265 | |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 266 | /* |
| 267 | * declarations |
| 268 | */ |
| 269 | xdcl: |
Russ Cox | 3997495 | 2009-12-11 15:59:41 -0800 | [diff] [blame^] | 270 | { |
| 271 | yyerror("empty top-level declaration"); |
| 272 | $$ = nil; |
| 273 | } |
| 274 | | common_dcl |
| 275 | | xfndcl |
Ken Thompson | 989676d | 2008-08-03 18:47:02 -0700 | [diff] [blame] | 276 | { |
Russ Cox | b648716 | 2009-08-07 12:50:26 -0700 | [diff] [blame] | 277 | $$ = list1($1); |
Ken Thompson | 989676d | 2008-08-03 18:47:02 -0700 | [diff] [blame] | 278 | } |
Russ Cox | 3997495 | 2009-12-11 15:59:41 -0800 | [diff] [blame^] | 279 | | error |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 280 | { |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 281 | $$ = nil; |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 282 | } |
| 283 | |
| 284 | common_dcl: |
Russ Cox | 8abcdee | 2009-06-06 19:27:48 -0700 | [diff] [blame] | 285 | LVAR vardcl |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 286 | { |
| 287 | $$ = $2; |
| 288 | } |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 289 | | LVAR '(' vardcl_list osemi ')' |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 290 | { |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 291 | $$ = $3; |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 292 | } |
Russ Cox | 5f120242 | 2008-10-08 15:33:09 -0700 | [diff] [blame] | 293 | | LVAR '(' ')' |
| 294 | { |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 295 | $$ = nil; |
Ken Thompson | 54abac6 | 2008-06-21 15:11:29 -0700 | [diff] [blame] | 296 | } |
| 297 | | LCONST constdcl |
| 298 | { |
Russ Cox | b648716 | 2009-08-07 12:50:26 -0700 | [diff] [blame] | 299 | $$ = $2; |
Ken Thompson | 54abac6 | 2008-06-21 15:11:29 -0700 | [diff] [blame] | 300 | iota = 0; |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 301 | lastconst = nil; |
Ken Thompson | 54abac6 | 2008-06-21 15:11:29 -0700 | [diff] [blame] | 302 | } |
Russ Cox | 8abcdee | 2009-06-06 19:27:48 -0700 | [diff] [blame] | 303 | | LCONST '(' constdcl osemi ')' |
| 304 | { |
Russ Cox | b648716 | 2009-08-07 12:50:26 -0700 | [diff] [blame] | 305 | $$ = $3; |
Russ Cox | 8abcdee | 2009-06-06 19:27:48 -0700 | [diff] [blame] | 306 | iota = 0; |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 307 | lastconst = nil; |
Russ Cox | 8abcdee | 2009-06-06 19:27:48 -0700 | [diff] [blame] | 308 | } |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 309 | | LCONST '(' constdcl ';' constdcl_list osemi ')' |
Russ Cox | 8abcdee | 2009-06-06 19:27:48 -0700 | [diff] [blame] | 310 | { |
Russ Cox | b648716 | 2009-08-07 12:50:26 -0700 | [diff] [blame] | 311 | $$ = concat($3, $5); |
Russ Cox | 8abcdee | 2009-06-06 19:27:48 -0700 | [diff] [blame] | 312 | iota = 0; |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 313 | lastconst = nil; |
Russ Cox | 8abcdee | 2009-06-06 19:27:48 -0700 | [diff] [blame] | 314 | } |
| 315 | | LCONST '(' ')' |
Ken Thompson | 54abac6 | 2008-06-21 15:11:29 -0700 | [diff] [blame] | 316 | { |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 317 | $$ = nil; |
Russ Cox | 8abcdee | 2009-06-06 19:27:48 -0700 | [diff] [blame] | 318 | } |
| 319 | | LTYPE typedcl |
| 320 | { |
Russ Cox | b648716 | 2009-08-07 12:50:26 -0700 | [diff] [blame] | 321 | $$ = list1($2); |
Russ Cox | 8abcdee | 2009-06-06 19:27:48 -0700 | [diff] [blame] | 322 | } |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 323 | | LTYPE '(' typedcl_list osemi ')' |
Russ Cox | 8abcdee | 2009-06-06 19:27:48 -0700 | [diff] [blame] | 324 | { |
Russ Cox | b648716 | 2009-08-07 12:50:26 -0700 | [diff] [blame] | 325 | $$ = $3; |
Russ Cox | 8abcdee | 2009-06-06 19:27:48 -0700 | [diff] [blame] | 326 | } |
| 327 | | LTYPE '(' ')' |
| 328 | { |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 329 | $$ = nil; |
Ken Thompson | 54abac6 | 2008-06-21 15:11:29 -0700 | [diff] [blame] | 330 | } |
| 331 | |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 332 | vardcl: |
Russ Cox | 3997495 | 2009-12-11 15:59:41 -0800 | [diff] [blame^] | 333 | dcl_name_list ntype |
Ken Thompson | 54abac6 | 2008-06-21 15:11:29 -0700 | [diff] [blame] | 334 | { |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 335 | $$ = variter($1, $2, nil); |
Ken Thompson | 54abac6 | 2008-06-21 15:11:29 -0700 | [diff] [blame] | 336 | } |
Russ Cox | 3997495 | 2009-12-11 15:59:41 -0800 | [diff] [blame^] | 337 | | dcl_name_list ntype '=' expr_list |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 338 | { |
Russ Cox | 3997495 | 2009-12-11 15:59:41 -0800 | [diff] [blame^] | 339 | $$ = variter($1, $2, $4); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 340 | } |
Russ Cox | db508ccbf | 2009-07-17 13:38:16 -0700 | [diff] [blame] | 341 | | dcl_name_list '=' expr_list |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 342 | { |
Russ Cox | 35e5906 | 2009-07-17 14:42:14 -0700 | [diff] [blame] | 343 | $$ = variter($1, nil, $3); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 344 | } |
| 345 | |
| 346 | constdcl: |
Russ Cox | db508ccbf | 2009-07-17 13:38:16 -0700 | [diff] [blame] | 347 | dcl_name_list ntype '=' expr_list |
Ken Thompson | d915b96 | 2008-07-03 16:41:32 -0700 | [diff] [blame] | 348 | { |
Russ Cox | db508ccbf | 2009-07-17 13:38:16 -0700 | [diff] [blame] | 349 | $$ = constiter($1, $2, $4); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 350 | } |
Russ Cox | db508ccbf | 2009-07-17 13:38:16 -0700 | [diff] [blame] | 351 | | dcl_name_list '=' expr_list |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 352 | { |
Russ Cox | db508ccbf | 2009-07-17 13:38:16 -0700 | [diff] [blame] | 353 | $$ = constiter($1, N, $3); |
Ken Thompson | 9dbaab5 | 2008-09-04 12:21:10 -0700 | [diff] [blame] | 354 | } |
| 355 | |
| 356 | constdcl1: |
| 357 | constdcl |
Russ Cox | db508ccbf | 2009-07-17 13:38:16 -0700 | [diff] [blame] | 358 | | dcl_name_list ntype |
Ken Thompson | 9dbaab5 | 2008-09-04 12:21:10 -0700 | [diff] [blame] | 359 | { |
Russ Cox | db508ccbf | 2009-07-17 13:38:16 -0700 | [diff] [blame] | 360 | $$ = constiter($1, $2, nil); |
Ken Thompson | 9dbaab5 | 2008-09-04 12:21:10 -0700 | [diff] [blame] | 361 | } |
Russ Cox | db508ccbf | 2009-07-17 13:38:16 -0700 | [diff] [blame] | 362 | | dcl_name_list |
Ken Thompson | 9dbaab5 | 2008-09-04 12:21:10 -0700 | [diff] [blame] | 363 | { |
Russ Cox | db508ccbf | 2009-07-17 13:38:16 -0700 | [diff] [blame] | 364 | $$ = constiter($1, N, nil); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 365 | } |
| 366 | |
Russ Cox | 74e2e08 | 2008-10-06 16:44:17 -0700 | [diff] [blame] | 367 | typedclname: |
Russ Cox | b648716 | 2009-08-07 12:50:26 -0700 | [diff] [blame] | 368 | sym |
Ken Thompson | 54abac6 | 2008-06-21 15:11:29 -0700 | [diff] [blame] | 369 | { |
Russ Cox | b648716 | 2009-08-07 12:50:26 -0700 | [diff] [blame] | 370 | // different from dclname because the name |
| 371 | // becomes visible right here, not at the end |
| 372 | // of the declaration. |
| 373 | $$ = typedcl0($1); |
Ken Thompson | 54abac6 | 2008-06-21 15:11:29 -0700 | [diff] [blame] | 374 | } |
| 375 | |
Russ Cox | d364d28 | 2008-10-07 12:36:30 -0700 | [diff] [blame] | 376 | typedcl: |
Russ Cox | 35e5906 | 2009-07-17 14:42:14 -0700 | [diff] [blame] | 377 | typedclname ntype |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 378 | { |
Russ Cox | b648716 | 2009-08-07 12:50:26 -0700 | [diff] [blame] | 379 | $$ = typedcl1($1, $2, 1); |
Russ Cox | 74e2e08 | 2008-10-06 16:44:17 -0700 | [diff] [blame] | 380 | } |
Russ Cox | b648716 | 2009-08-07 12:50:26 -0700 | [diff] [blame] | 381 | |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 382 | simple_stmt: |
| 383 | expr |
| 384 | { |
| 385 | $$ = $1; |
| 386 | } |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 387 | | expr LASOP expr |
| 388 | { |
| 389 | $$ = nod(OASOP, $1, $3); |
Ken Thompson | 9c2ade3 | 2008-08-08 17:13:31 -0700 | [diff] [blame] | 390 | $$->etype = $2; // rathole to pass opcode |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 391 | } |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 392 | | expr_list '=' expr_list |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 393 | { |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 394 | if($1->next == nil && $3->next == nil) { |
| 395 | // simple |
| 396 | $$ = nod(OAS, $1->n, $3->n); |
| 397 | break; |
| 398 | } |
| 399 | // multiple |
| 400 | $$ = nod(OAS2, N, N); |
| 401 | $$->list = $1; |
| 402 | $$->rlist = $3; |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 403 | } |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 404 | | expr_list LCOLAS expr_list |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 405 | { |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 406 | if($3->n->op == OTYPESW) { |
| 407 | if($3->next != nil) |
| 408 | yyerror("expr.(type) must be alone in list"); |
| 409 | else if($1->next != nil) |
| 410 | yyerror("argument count mismatch: %d = %d", count($1), 1); |
Russ Cox | 5d16d23 | 2009-09-09 00:18:16 -0700 | [diff] [blame] | 411 | $$ = nod(OTYPESW, $1->n, $3->n->right); |
Ken Thompson | a4a10ed | 2009-03-06 17:50:43 -0800 | [diff] [blame] | 412 | break; |
| 413 | } |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 414 | $$ = colas($1, $3); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 415 | } |
Russ Cox | d364d28 | 2008-10-07 12:36:30 -0700 | [diff] [blame] | 416 | | expr LINC |
Ken Thompson | c242b53 | 2008-06-17 22:33:32 -0700 | [diff] [blame] | 417 | { |
Russ Cox | 8f194bf | 2009-03-12 19:04:38 -0700 | [diff] [blame] | 418 | $$ = nod(OASOP, $1, nodintconst(1)); |
Ken Thompson | c242b53 | 2008-06-17 22:33:32 -0700 | [diff] [blame] | 419 | $$->etype = OADD; |
| 420 | } |
| 421 | | expr LDEC |
| 422 | { |
Russ Cox | 8f194bf | 2009-03-12 19:04:38 -0700 | [diff] [blame] | 423 | $$ = nod(OASOP, $1, nodintconst(1)); |
Ken Thompson | c242b53 | 2008-06-17 22:33:32 -0700 | [diff] [blame] | 424 | $$->etype = OSUB; |
| 425 | } |
| 426 | |
Russ Cox | d6a9817 | 2009-05-30 21:18:15 -0700 | [diff] [blame] | 427 | case: |
Russ Cox | 35e5906 | 2009-07-17 14:42:14 -0700 | [diff] [blame] | 428 | LCASE expr_or_type_list ':' |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 429 | { |
Russ Cox | 5d16d23 | 2009-09-09 00:18:16 -0700 | [diff] [blame] | 430 | Node *n; |
Russ Cox | 0dadc4f | 2009-07-10 16:29:26 -0700 | [diff] [blame] | 431 | |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 432 | // will be converted to OCASE |
| 433 | // right will point to next case |
| 434 | // done in casebody() |
| 435 | poptodcl(); |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 436 | $$ = nod(OXCASE, N, N); |
Russ Cox | 5d16d23 | 2009-09-09 00:18:16 -0700 | [diff] [blame] | 437 | $$->list = $2; |
| 438 | if(typesw != N && typesw->right != N && (n=typesw->right->left) != N) { |
| 439 | // type switch - declare variable |
| 440 | n = newname(n->sym); |
Russ Cox | 5991472 | 2009-09-14 18:38:30 -0700 | [diff] [blame] | 441 | n->used = 1; // TODO(rsc): better job here |
Russ Cox | 2609731 | 2009-08-05 02:33:30 -0700 | [diff] [blame] | 442 | declare(n, dclcontext); |
Russ Cox | 5d16d23 | 2009-09-09 00:18:16 -0700 | [diff] [blame] | 443 | $$->nname = n; |
Ken Thompson | 0f469a9 | 2009-03-17 13:58:38 -0700 | [diff] [blame] | 444 | } |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 445 | break; |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 446 | } |
Rob Pike | 4791979 | 2008-09-16 19:14:33 -0700 | [diff] [blame] | 447 | | LCASE name '=' expr ':' |
| 448 | { |
| 449 | // will be converted to OCASE |
| 450 | // right will point to next case |
| 451 | // done in casebody() |
| 452 | poptodcl(); |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 453 | $$ = nod(OXCASE, N, N); |
| 454 | $$->list = list1(nod(OAS, $2, $4)); |
Rob Pike | 4791979 | 2008-09-16 19:14:33 -0700 | [diff] [blame] | 455 | } |
| 456 | | LCASE name LCOLAS expr ':' |
| 457 | { |
| 458 | // will be converted to OCASE |
| 459 | // right will point to next case |
| 460 | // done in casebody() |
| 461 | poptodcl(); |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 462 | $$ = nod(OXCASE, N, N); |
Russ Cox | 54b4037 | 2009-08-05 00:42:44 -0700 | [diff] [blame] | 463 | $$->list = list1(colas(list1($2), list1($4))); |
Rob Pike | 4791979 | 2008-09-16 19:14:33 -0700 | [diff] [blame] | 464 | } |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 465 | | LDEFAULT ':' |
| 466 | { |
Russ Cox | 5d16d23 | 2009-09-09 00:18:16 -0700 | [diff] [blame] | 467 | Node *n; |
| 468 | |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 469 | poptodcl(); |
| 470 | $$ = nod(OXCASE, N, N); |
Russ Cox | 5d16d23 | 2009-09-09 00:18:16 -0700 | [diff] [blame] | 471 | if(typesw != N && typesw->right != N && (n=typesw->right->left) != N) { |
| 472 | // type switch - declare variable |
| 473 | n = newname(n->sym); |
Russ Cox | 5991472 | 2009-09-14 18:38:30 -0700 | [diff] [blame] | 474 | n->used = 1; // TODO(rsc): better job here |
Russ Cox | 5d16d23 | 2009-09-09 00:18:16 -0700 | [diff] [blame] | 475 | declare(n, dclcontext); |
| 476 | $$->nname = n; |
| 477 | } |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 478 | } |
Ken Thompson | 8200a0b | 2008-06-08 12:48:37 -0700 | [diff] [blame] | 479 | |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 480 | compound_stmt: |
| 481 | '{' |
| 482 | { |
Ken Thompson | 417a971 | 2008-07-05 12:49:25 -0700 | [diff] [blame] | 483 | markdcl(); |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 484 | } |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 485 | stmt_list '}' |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 486 | { |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 487 | $$ = liststmt($3); |
Ken Thompson | 417a971 | 2008-07-05 12:49:25 -0700 | [diff] [blame] | 488 | popdcl(); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 489 | } |
| 490 | |
Russ Cox | d6a9817 | 2009-05-30 21:18:15 -0700 | [diff] [blame] | 491 | switch_body: |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 492 | LBODY |
Russ Cox | d6a9817 | 2009-05-30 21:18:15 -0700 | [diff] [blame] | 493 | { |
| 494 | markdcl(); |
| 495 | } |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 496 | caseblock_list '}' |
Russ Cox | d6a9817 | 2009-05-30 21:18:15 -0700 | [diff] [blame] | 497 | { |
| 498 | $$ = $3; |
Russ Cox | d6a9817 | 2009-05-30 21:18:15 -0700 | [diff] [blame] | 499 | popdcl(); |
| 500 | } |
| 501 | |
| 502 | caseblock: |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 503 | case stmt_list |
Russ Cox | d6a9817 | 2009-05-30 21:18:15 -0700 | [diff] [blame] | 504 | { |
| 505 | $$ = $1; |
| 506 | $$->nbody = $2; |
| 507 | } |
| 508 | |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 509 | caseblock_list: |
Russ Cox | d6a9817 | 2009-05-30 21:18:15 -0700 | [diff] [blame] | 510 | { |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 511 | $$ = nil; |
| 512 | } |
| 513 | | caseblock_list caseblock |
| 514 | { |
| 515 | $$ = list($1, $2); |
Russ Cox | d6a9817 | 2009-05-30 21:18:15 -0700 | [diff] [blame] | 516 | } |
| 517 | |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 518 | loop_body: |
| 519 | LBODY |
| 520 | { |
| 521 | markdcl(); |
| 522 | } |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 523 | stmt_list '}' |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 524 | { |
| 525 | $$ = $3; |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 526 | popdcl(); |
| 527 | } |
| 528 | |
Russ Cox | 3ec4675 | 2009-01-28 15:41:50 -0800 | [diff] [blame] | 529 | range_stmt: |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 530 | expr_list '=' LRANGE expr |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 531 | { |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 532 | $$ = nod(ORANGE, N, $4); |
| 533 | $$->list = $1; |
Ken Thompson | b79272d | 2008-12-06 13:40:30 -0800 | [diff] [blame] | 534 | $$->etype = 0; // := flag |
| 535 | } |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 536 | | expr_list LCOLAS LRANGE expr |
Ken Thompson | b79272d | 2008-12-06 13:40:30 -0800 | [diff] [blame] | 537 | { |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 538 | $$ = nod(ORANGE, N, $4); |
| 539 | $$->list = $1; |
Russ Cox | 2609731 | 2009-08-05 02:33:30 -0700 | [diff] [blame] | 540 | $$->colas = 1; |
| 541 | colasdefn($1, $$); |
Ken Thompson | b79272d | 2008-12-06 13:40:30 -0800 | [diff] [blame] | 542 | } |
Ken Thompson | b79272d | 2008-12-06 13:40:30 -0800 | [diff] [blame] | 543 | |
| 544 | for_header: |
Russ Cox | 3ec4675 | 2009-01-28 15:41:50 -0800 | [diff] [blame] | 545 | osimple_stmt ';' osimple_stmt ';' osimple_stmt |
Ken Thompson | b79272d | 2008-12-06 13:40:30 -0800 | [diff] [blame] | 546 | { |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 547 | // init ; test ; incr |
Ken Thompson | ae5a475 | 2008-12-15 13:44:27 -0800 | [diff] [blame] | 548 | if($5 != N && $5->colas != 0) |
| 549 | yyerror("cannot declare in the for-increment"); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 550 | $$ = nod(OFOR, N, N); |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 551 | if($1 != N) |
| 552 | $$->ninit = list1($1); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 553 | $$->ntest = $3; |
| 554 | $$->nincr = $5; |
| 555 | } |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 556 | | osimple_stmt |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 557 | { |
Ken Thompson | b79272d | 2008-12-06 13:40:30 -0800 | [diff] [blame] | 558 | // normal test |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 559 | $$ = nod(OFOR, N, N); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 560 | $$->ntest = $1; |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 561 | } |
Russ Cox | 3ec4675 | 2009-01-28 15:41:50 -0800 | [diff] [blame] | 562 | | range_stmt |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 563 | |
| 564 | for_body: |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 565 | for_header loop_body |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 566 | { |
| 567 | $$ = $1; |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 568 | $$->nbody = concat($$->nbody, $2); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 569 | } |
| 570 | |
| 571 | for_stmt: |
Russ Cox | d6a9817 | 2009-05-30 21:18:15 -0700 | [diff] [blame] | 572 | LFOR |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 573 | { |
Ken Thompson | 417a971 | 2008-07-05 12:49:25 -0700 | [diff] [blame] | 574 | markdcl(); |
Russ Cox | d6a9817 | 2009-05-30 21:18:15 -0700 | [diff] [blame] | 575 | } |
| 576 | for_body |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 577 | { |
Russ Cox | d6a9817 | 2009-05-30 21:18:15 -0700 | [diff] [blame] | 578 | $$ = $3; |
| 579 | popdcl(); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 580 | } |
| 581 | |
| 582 | if_header: |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 583 | osimple_stmt |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 584 | { |
| 585 | // test |
| 586 | $$ = nod(OIF, N, N); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 587 | $$->ntest = $1; |
| 588 | } |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 589 | | osimple_stmt ';' osimple_stmt |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 590 | { |
| 591 | // init ; test |
| 592 | $$ = nod(OIF, N, N); |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 593 | if($1 != N) |
| 594 | $$->ninit = list1($1); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 595 | $$->ntest = $3; |
| 596 | } |
| 597 | |
Russ Cox | d6a9817 | 2009-05-30 21:18:15 -0700 | [diff] [blame] | 598 | if_stmt: |
| 599 | LIF |
| 600 | { |
| 601 | markdcl(); |
| 602 | } |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 603 | if_header loop_body |
Russ Cox | d6a9817 | 2009-05-30 21:18:15 -0700 | [diff] [blame] | 604 | { |
| 605 | $$ = $3; |
| 606 | $$->nbody = $4; |
| 607 | // no popdcl; maybe there's an LELSE |
| 608 | } |
| 609 | |
| 610 | switch_stmt: |
| 611 | LSWITCH |
| 612 | { |
| 613 | markdcl(); |
| 614 | } |
Ken Thompson | a4a10ed | 2009-03-06 17:50:43 -0800 | [diff] [blame] | 615 | if_header |
| 616 | { |
| 617 | Node *n; |
Russ Cox | d6a9817 | 2009-05-30 21:18:15 -0700 | [diff] [blame] | 618 | n = $3->ntest; |
Russ Cox | 5d16d23 | 2009-09-09 00:18:16 -0700 | [diff] [blame] | 619 | if(n != N && n->op != OTYPESW) |
Ken Thompson | a4a10ed | 2009-03-06 17:50:43 -0800 | [diff] [blame] | 620 | n = N; |
Russ Cox | 5d16d23 | 2009-09-09 00:18:16 -0700 | [diff] [blame] | 621 | typesw = nod(OXXX, typesw, n); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 622 | } |
Russ Cox | d6a9817 | 2009-05-30 21:18:15 -0700 | [diff] [blame] | 623 | switch_body |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 624 | { |
Russ Cox | d6a9817 | 2009-05-30 21:18:15 -0700 | [diff] [blame] | 625 | $$ = $3; |
| 626 | $$->op = OSWITCH; |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 627 | $$->list = $5; |
Russ Cox | 5d16d23 | 2009-09-09 00:18:16 -0700 | [diff] [blame] | 628 | typesw = typesw->left; |
Russ Cox | d6a9817 | 2009-05-30 21:18:15 -0700 | [diff] [blame] | 629 | popdcl(); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 630 | } |
| 631 | |
Ken Thompson | b78676a | 2008-07-20 20:13:07 -0700 | [diff] [blame] | 632 | select_stmt: |
Russ Cox | d6a9817 | 2009-05-30 21:18:15 -0700 | [diff] [blame] | 633 | LSELECT |
Ken Thompson | b78676a | 2008-07-20 20:13:07 -0700 | [diff] [blame] | 634 | { |
| 635 | markdcl(); |
| 636 | } |
Russ Cox | d6a9817 | 2009-05-30 21:18:15 -0700 | [diff] [blame] | 637 | switch_body |
Ken Thompson | b78676a | 2008-07-20 20:13:07 -0700 | [diff] [blame] | 638 | { |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 639 | $$ = nod(OSELECT, N, N); |
| 640 | $$->list = $3; |
Russ Cox | d6a9817 | 2009-05-30 21:18:15 -0700 | [diff] [blame] | 641 | popdcl(); |
Ken Thompson | b78676a | 2008-07-20 20:13:07 -0700 | [diff] [blame] | 642 | } |
| 643 | |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 644 | /* |
| 645 | * expressions |
| 646 | */ |
| 647 | expr: |
| 648 | uexpr |
| 649 | | expr LOROR expr |
| 650 | { |
| 651 | $$ = nod(OOROR, $1, $3); |
| 652 | } |
| 653 | | expr LANDAND expr |
| 654 | { |
| 655 | $$ = nod(OANDAND, $1, $3); |
| 656 | } |
| 657 | | expr LEQ expr |
| 658 | { |
| 659 | $$ = nod(OEQ, $1, $3); |
| 660 | } |
| 661 | | expr LNE expr |
| 662 | { |
| 663 | $$ = nod(ONE, $1, $3); |
| 664 | } |
| 665 | | expr LLT expr |
| 666 | { |
| 667 | $$ = nod(OLT, $1, $3); |
| 668 | } |
| 669 | | expr LLE expr |
| 670 | { |
| 671 | $$ = nod(OLE, $1, $3); |
| 672 | } |
| 673 | | expr LGE expr |
| 674 | { |
| 675 | $$ = nod(OGE, $1, $3); |
| 676 | } |
| 677 | | expr LGT expr |
| 678 | { |
| 679 | $$ = nod(OGT, $1, $3); |
| 680 | } |
| 681 | | expr '+' expr |
| 682 | { |
| 683 | $$ = nod(OADD, $1, $3); |
| 684 | } |
| 685 | | expr '-' expr |
| 686 | { |
| 687 | $$ = nod(OSUB, $1, $3); |
| 688 | } |
| 689 | | expr '|' expr |
| 690 | { |
| 691 | $$ = nod(OOR, $1, $3); |
| 692 | } |
| 693 | | expr '^' expr |
| 694 | { |
| 695 | $$ = nod(OXOR, $1, $3); |
| 696 | } |
| 697 | | expr '*' expr |
| 698 | { |
| 699 | $$ = nod(OMUL, $1, $3); |
| 700 | } |
| 701 | | expr '/' expr |
| 702 | { |
| 703 | $$ = nod(ODIV, $1, $3); |
| 704 | } |
| 705 | | expr '%' expr |
| 706 | { |
| 707 | $$ = nod(OMOD, $1, $3); |
| 708 | } |
| 709 | | expr '&' expr |
| 710 | { |
| 711 | $$ = nod(OAND, $1, $3); |
| 712 | } |
Ken Thompson | bb02e48 | 2009-03-11 19:59:35 -0700 | [diff] [blame] | 713 | | expr LANDNOT expr |
| 714 | { |
| 715 | $$ = nod(OANDNOT, $1, $3); |
| 716 | } |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 717 | | expr LLSH expr |
| 718 | { |
| 719 | $$ = nod(OLSH, $1, $3); |
| 720 | } |
| 721 | | expr LRSH expr |
| 722 | { |
| 723 | $$ = nod(ORSH, $1, $3); |
| 724 | } |
Rob Pike | 4791979 | 2008-09-16 19:14:33 -0700 | [diff] [blame] | 725 | | expr LCOMM expr |
Ken Thompson | ac048ce | 2008-07-15 21:07:59 -0700 | [diff] [blame] | 726 | { |
| 727 | $$ = nod(OSEND, $1, $3); |
| 728 | } |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 729 | |
| 730 | uexpr: |
| 731 | pexpr |
| 732 | | '*' uexpr |
| 733 | { |
| 734 | $$ = nod(OIND, $2, N); |
| 735 | } |
| 736 | | '&' uexpr |
| 737 | { |
| 738 | $$ = nod(OADDR, $2, N); |
| 739 | } |
| 740 | | '+' uexpr |
| 741 | { |
| 742 | $$ = nod(OPLUS, $2, N); |
| 743 | } |
| 744 | | '-' uexpr |
| 745 | { |
| 746 | $$ = nod(OMINUS, $2, N); |
| 747 | } |
| 748 | | '!' uexpr |
| 749 | { |
| 750 | $$ = nod(ONOT, $2, N); |
| 751 | } |
| 752 | | '~' uexpr |
| 753 | { |
| 754 | yyerror("the OCOM operator is ^"); |
| 755 | $$ = nod(OCOM, $2, N); |
| 756 | } |
| 757 | | '^' uexpr |
| 758 | { |
| 759 | $$ = nod(OCOM, $2, N); |
| 760 | } |
Rob Pike | 4791979 | 2008-09-16 19:14:33 -0700 | [diff] [blame] | 761 | | LCOMM uexpr |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 762 | { |
| 763 | $$ = nod(ORECV, $2, N); |
| 764 | } |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 765 | |
Ken Thompson | 7a98315 | 2009-04-28 17:20:18 -0700 | [diff] [blame] | 766 | /* |
| 767 | * call-like statements that |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 768 | * can be preceded by 'defer' and 'go' |
Ken Thompson | 7a98315 | 2009-04-28 17:20:18 -0700 | [diff] [blame] | 769 | */ |
| 770 | pseudocall: |
Russ Cox | 3997495 | 2009-12-11 15:59:41 -0800 | [diff] [blame^] | 771 | pexpr '(' oexpr_or_type_list_ocomma ')' |
Ken Thompson | 7a98315 | 2009-04-28 17:20:18 -0700 | [diff] [blame] | 772 | { |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 773 | $$ = nod(OCALL, $1, N); |
| 774 | $$->list = $3; |
Ken Thompson | 7a98315 | 2009-04-28 17:20:18 -0700 | [diff] [blame] | 775 | } |
| 776 | |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 777 | pexpr: |
| 778 | LLITERAL |
| 779 | { |
Russ Cox | 8f194bf | 2009-03-12 19:04:38 -0700 | [diff] [blame] | 780 | $$ = nodlit($1); |
| 781 | } |
Russ Cox | 35e5906 | 2009-07-17 14:42:14 -0700 | [diff] [blame] | 782 | | name |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 783 | | pexpr '.' sym |
Russ Cox | 8f194bf | 2009-03-12 19:04:38 -0700 | [diff] [blame] | 784 | { |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 785 | if($1->op == OPACK) { |
| 786 | Sym *s; |
Russ Cox | be16caf | 2009-07-13 23:38:39 -0700 | [diff] [blame] | 787 | s = restrictlookup($3->name, $1->sym->name); |
Russ Cox | 73e52ae | 2009-09-17 16:42:10 -0700 | [diff] [blame] | 788 | $1->used = 1; |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 789 | $$ = oldname(s); |
| 790 | break; |
| 791 | } |
Russ Cox | 2609731 | 2009-08-05 02:33:30 -0700 | [diff] [blame] | 792 | $$ = nod(OXDOT, $1, newname($3)); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 793 | } |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 794 | | '(' expr_or_type ')' |
| 795 | { |
| 796 | $$ = $2; |
| 797 | } |
| 798 | | pexpr '.' '(' expr_or_type ')' |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 799 | { |
Russ Cox | be16caf | 2009-07-13 23:38:39 -0700 | [diff] [blame] | 800 | $$ = nod(ODOTTYPE, $1, $4); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 801 | } |
Ken Thompson | a4a10ed | 2009-03-06 17:50:43 -0800 | [diff] [blame] | 802 | | pexpr '.' '(' LTYPE ')' |
| 803 | { |
Russ Cox | 5d16d23 | 2009-09-09 00:18:16 -0700 | [diff] [blame] | 804 | $$ = nod(OTYPESW, N, $1); |
Ken Thompson | a4a10ed | 2009-03-06 17:50:43 -0800 | [diff] [blame] | 805 | } |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 806 | | pexpr '[' expr ']' |
| 807 | { |
| 808 | $$ = nod(OINDEX, $1, $3); |
| 809 | } |
Russ Cox | 652f556 | 2009-11-20 09:11:46 -0800 | [diff] [blame] | 810 | | pexpr '[' expr ':' ']' |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 811 | { |
Russ Cox | 652f556 | 2009-11-20 09:11:46 -0800 | [diff] [blame] | 812 | $$ = nod(OSLICE, $1, nod(OKEY, $3, N)); |
| 813 | } |
| 814 | | pexpr '[' expr ':' expr ']' |
| 815 | { |
| 816 | $$ = nod(OSLICE, $1, nod(OKEY, $3, $5)); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 817 | } |
Ken Thompson | 7a98315 | 2009-04-28 17:20:18 -0700 | [diff] [blame] | 818 | | pseudocall |
Russ Cox | 49cc649 | 2009-03-03 08:41:02 -0800 | [diff] [blame] | 819 | | convtype '(' expr ')' |
Ken Thompson | 0194aaf | 2008-09-05 19:50:34 -0700 | [diff] [blame] | 820 | { |
Russ Cox | 49cc649 | 2009-03-03 08:41:02 -0800 | [diff] [blame] | 821 | // conversion |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 822 | $$ = nod(OCALL, $1, N); |
| 823 | $$->list = list1($3); |
Ken Thompson | 0194aaf | 2008-09-05 19:50:34 -0700 | [diff] [blame] | 824 | } |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 825 | | convtype lbrace braced_keyval_list '}' |
Ken Thompson | 0194aaf | 2008-09-05 19:50:34 -0700 | [diff] [blame] | 826 | { |
Russ Cox | 49cc649 | 2009-03-03 08:41:02 -0800 | [diff] [blame] | 827 | // composite expression |
Russ Cox | 9dc22b6 | 2009-08-03 11:58:52 -0700 | [diff] [blame] | 828 | $$ = nod(OCOMPLIT, N, $1); |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 829 | $$->list = $3; |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 830 | |
| 831 | // If the opening brace was an LBODY, |
| 832 | // set up for another one now that we're done. |
| 833 | // See comment in lex.c about loophack. |
| 834 | if($2 == LBODY) |
| 835 | loophack = 1; |
| 836 | } |
Russ Cox | 6f16987 | 2009-09-29 21:21:14 -0700 | [diff] [blame] | 837 | | pexpr '{' braced_keyval_list '}' |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 838 | { |
| 839 | // composite expression |
Russ Cox | 9dc22b6 | 2009-08-03 11:58:52 -0700 | [diff] [blame] | 840 | $$ = nod(OCOMPLIT, N, $1); |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 841 | $$->list = $3; |
Ken Thompson | 0194aaf | 2008-09-05 19:50:34 -0700 | [diff] [blame] | 842 | } |
| 843 | | fnliteral |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 844 | |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 845 | expr_or_type: |
| 846 | expr |
Russ Cox | 35e5906 | 2009-07-17 14:42:14 -0700 | [diff] [blame] | 847 | | non_expr_type %prec PreferToRightParen |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 848 | |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 849 | name_or_type: |
Russ Cox | 35e5906 | 2009-07-17 14:42:14 -0700 | [diff] [blame] | 850 | ntype |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 851 | |
| 852 | lbrace: |
| 853 | LBODY |
| 854 | { |
| 855 | $$ = LBODY; |
| 856 | } |
| 857 | | '{' |
| 858 | { |
| 859 | $$ = '{'; |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 860 | } |
| 861 | |
| 862 | /* |
| 863 | * names and types |
| 864 | * newname is used before declared |
| 865 | * oldname is used after declared |
| 866 | */ |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 867 | new_name: |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 868 | sym |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 869 | { |
| 870 | $$ = newname($1); |
| 871 | } |
| 872 | |
Russ Cox | db508ccbf | 2009-07-17 13:38:16 -0700 | [diff] [blame] | 873 | dcl_name: |
| 874 | sym |
| 875 | { |
| 876 | $$ = dclname($1); |
| 877 | } |
| 878 | |
Ken Thompson | 33ee527 | 2008-08-29 20:30:19 -0700 | [diff] [blame] | 879 | onew_name: |
| 880 | { |
| 881 | $$ = N; |
| 882 | } |
| 883 | | new_name |
| 884 | |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 885 | sym: |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 886 | LNAME |
Ken Thompson | e8278bc | 2008-10-26 14:04:09 -0700 | [diff] [blame] | 887 | |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 888 | name: |
Russ Cox | 35e5906 | 2009-07-17 14:42:14 -0700 | [diff] [blame] | 889 | sym |
Russ Cox | 63985b4 | 2009-03-05 15:57:03 -0800 | [diff] [blame] | 890 | { |
| 891 | $$ = oldname($1); |
Russ Cox | 73e52ae | 2009-09-17 16:42:10 -0700 | [diff] [blame] | 892 | if($$->pack != N) |
| 893 | $$->pack->used = 1; |
Russ Cox | 63985b4 | 2009-03-05 15:57:03 -0800 | [diff] [blame] | 894 | } |
| 895 | |
| 896 | labelname: |
Russ Cox | b648716 | 2009-08-07 12:50:26 -0700 | [diff] [blame] | 897 | new_name |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 898 | |
Ken Thompson | 0194aaf | 2008-09-05 19:50:34 -0700 | [diff] [blame] | 899 | convtype: |
Russ Cox | be16caf | 2009-07-13 23:38:39 -0700 | [diff] [blame] | 900 | '[' oexpr ']' ntype |
Ken Thompson | 8200a0b | 2008-06-08 12:48:37 -0700 | [diff] [blame] | 901 | { |
Ken Thompson | 4539ced | 2008-09-03 14:09:29 -0700 | [diff] [blame] | 902 | // array literal |
Russ Cox | be16caf | 2009-07-13 23:38:39 -0700 | [diff] [blame] | 903 | $$ = nod(OTARRAY, $2, $4); |
Ken Thompson | 8200a0b | 2008-06-08 12:48:37 -0700 | [diff] [blame] | 904 | } |
Russ Cox | be16caf | 2009-07-13 23:38:39 -0700 | [diff] [blame] | 905 | | '[' dotdotdot ']' ntype |
Ken Thompson | b0f627a | 2009-01-06 17:31:24 -0800 | [diff] [blame] | 906 | { |
| 907 | // array literal of nelem |
Russ Cox | be16caf | 2009-07-13 23:38:39 -0700 | [diff] [blame] | 908 | $$ = nod(OTARRAY, $2, $4); |
Ken Thompson | b0f627a | 2009-01-06 17:31:24 -0800 | [diff] [blame] | 909 | } |
Russ Cox | be16caf | 2009-07-13 23:38:39 -0700 | [diff] [blame] | 910 | | LMAP '[' ntype ']' ntype |
Ken Thompson | 8200a0b | 2008-06-08 12:48:37 -0700 | [diff] [blame] | 911 | { |
Ken Thompson | 4539ced | 2008-09-03 14:09:29 -0700 | [diff] [blame] | 912 | // map literal |
Russ Cox | be16caf | 2009-07-13 23:38:39 -0700 | [diff] [blame] | 913 | $$ = nod(OTMAP, $3, $5); |
Ken Thompson | 8200a0b | 2008-06-08 12:48:37 -0700 | [diff] [blame] | 914 | } |
Ken Thompson | 0194aaf | 2008-09-05 19:50:34 -0700 | [diff] [blame] | 915 | | structtype |
Ken Thompson | 8200a0b | 2008-06-08 12:48:37 -0700 | [diff] [blame] | 916 | |
Russ Cox | d364d28 | 2008-10-07 12:36:30 -0700 | [diff] [blame] | 917 | /* |
| 918 | * to avoid parsing conflicts, type is split into |
Russ Cox | d364d28 | 2008-10-07 12:36:30 -0700 | [diff] [blame] | 919 | * channel types |
| 920 | * function types |
Russ Cox | 8abcdee | 2009-06-06 19:27:48 -0700 | [diff] [blame] | 921 | * parenthesized types |
Russ Cox | d364d28 | 2008-10-07 12:36:30 -0700 | [diff] [blame] | 922 | * any other type |
Russ Cox | d364d28 | 2008-10-07 12:36:30 -0700 | [diff] [blame] | 923 | * the type system makes additional restrictions, |
| 924 | * but those are not implemented in the grammar. |
| 925 | */ |
Ken Thompson | c21d9a1 | 2008-10-29 12:46:44 -0700 | [diff] [blame] | 926 | dotdotdot: |
| 927 | LDDD |
| 928 | { |
Russ Cox | be16caf | 2009-07-13 23:38:39 -0700 | [diff] [blame] | 929 | $$ = typenod(typ(TDDD)); |
Ken Thompson | c21d9a1 | 2008-10-29 12:46:44 -0700 | [diff] [blame] | 930 | } |
Russ Cox | d364d28 | 2008-10-07 12:36:30 -0700 | [diff] [blame] | 931 | |
Russ Cox | be16caf | 2009-07-13 23:38:39 -0700 | [diff] [blame] | 932 | ntype: |
Russ Cox | 8abcdee | 2009-06-06 19:27:48 -0700 | [diff] [blame] | 933 | chantype |
Russ Cox | db508ccbf | 2009-07-17 13:38:16 -0700 | [diff] [blame] | 934 | | fntype |
Russ Cox | 8abcdee | 2009-06-06 19:27:48 -0700 | [diff] [blame] | 935 | | othertype |
Russ Cox | 35e5906 | 2009-07-17 14:42:14 -0700 | [diff] [blame] | 936 | | ptrtype |
| 937 | | dotname |
Russ Cox | be16caf | 2009-07-13 23:38:39 -0700 | [diff] [blame] | 938 | | '(' ntype ')' |
Russ Cox | ebc10db | 2009-02-18 10:07:46 -0800 | [diff] [blame] | 939 | { |
| 940 | $$ = $2; |
| 941 | } |
Russ Cox | d364d28 | 2008-10-07 12:36:30 -0700 | [diff] [blame] | 942 | |
Russ Cox | 35e5906 | 2009-07-17 14:42:14 -0700 | [diff] [blame] | 943 | non_expr_type: |
| 944 | chantype |
| 945 | | fntype |
| 946 | | othertype |
| 947 | | '*' non_expr_type |
| 948 | { |
| 949 | $$ = nod(OIND, $2, N); |
| 950 | } |
| 951 | | '(' non_expr_type ')' |
| 952 | { |
| 953 | $$ = $2; |
| 954 | } |
| 955 | |
Russ Cox | 8abcdee | 2009-06-06 19:27:48 -0700 | [diff] [blame] | 956 | non_chan_type: |
Russ Cox | db508ccbf | 2009-07-17 13:38:16 -0700 | [diff] [blame] | 957 | fntype |
Russ Cox | 8abcdee | 2009-06-06 19:27:48 -0700 | [diff] [blame] | 958 | | othertype |
Russ Cox | 35e5906 | 2009-07-17 14:42:14 -0700 | [diff] [blame] | 959 | | ptrtype |
| 960 | | dotname |
Russ Cox | be16caf | 2009-07-13 23:38:39 -0700 | [diff] [blame] | 961 | | '(' ntype ')' |
Russ Cox | 4d571c9 | 2008-09-30 12:53:11 -0700 | [diff] [blame] | 962 | { |
Russ Cox | 8abcdee | 2009-06-06 19:27:48 -0700 | [diff] [blame] | 963 | $$ = $2; |
Russ Cox | 4d571c9 | 2008-09-30 12:53:11 -0700 | [diff] [blame] | 964 | } |
Russ Cox | 4d571c9 | 2008-09-30 12:53:11 -0700 | [diff] [blame] | 965 | |
Russ Cox | 8abcdee | 2009-06-06 19:27:48 -0700 | [diff] [blame] | 966 | non_fn_type: |
| 967 | chantype |
| 968 | | othertype |
Russ Cox | 35e5906 | 2009-07-17 14:42:14 -0700 | [diff] [blame] | 969 | | ptrtype |
| 970 | | dotname |
Russ Cox | 8abcdee | 2009-06-06 19:27:48 -0700 | [diff] [blame] | 971 | |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 972 | dotname: |
Russ Cox | 35e5906 | 2009-07-17 14:42:14 -0700 | [diff] [blame] | 973 | name |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 974 | | name '.' sym |
| 975 | { |
| 976 | if($1->op == OPACK) { |
| 977 | Sym *s; |
Russ Cox | be16caf | 2009-07-13 23:38:39 -0700 | [diff] [blame] | 978 | s = restrictlookup($3->name, $1->sym->name); |
Russ Cox | 73e52ae | 2009-09-17 16:42:10 -0700 | [diff] [blame] | 979 | $1->used = 1; |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 980 | $$ = oldname(s); |
| 981 | break; |
| 982 | } |
Russ Cox | 2609731 | 2009-08-05 02:33:30 -0700 | [diff] [blame] | 983 | $$ = nod(OXDOT, $1, newname($3)); |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 984 | } |
Russ Cox | d364d28 | 2008-10-07 12:36:30 -0700 | [diff] [blame] | 985 | |
Russ Cox | 8abcdee | 2009-06-06 19:27:48 -0700 | [diff] [blame] | 986 | othertype: |
Russ Cox | 35e5906 | 2009-07-17 14:42:14 -0700 | [diff] [blame] | 987 | '[' oexpr ']' ntype |
Russ Cox | d364d28 | 2008-10-07 12:36:30 -0700 | [diff] [blame] | 988 | { |
Russ Cox | 35e5906 | 2009-07-17 14:42:14 -0700 | [diff] [blame] | 989 | $$ = nod(OTARRAY, $2, $4); |
Russ Cox | d364d28 | 2008-10-07 12:36:30 -0700 | [diff] [blame] | 990 | } |
Russ Cox | 6f16987 | 2009-09-29 21:21:14 -0700 | [diff] [blame] | 991 | | '[' dotdotdot ']' ntype |
| 992 | { |
| 993 | // array literal of nelem |
| 994 | $$ = nod(OTARRAY, $2, $4); |
| 995 | } |
Russ Cox | be16caf | 2009-07-13 23:38:39 -0700 | [diff] [blame] | 996 | | LCOMM LCHAN ntype |
Russ Cox | d364d28 | 2008-10-07 12:36:30 -0700 | [diff] [blame] | 997 | { |
Russ Cox | be16caf | 2009-07-13 23:38:39 -0700 | [diff] [blame] | 998 | $$ = nod(OTCHAN, $3, N); |
| 999 | $$->etype = Crecv; |
Russ Cox | d364d28 | 2008-10-07 12:36:30 -0700 | [diff] [blame] | 1000 | } |
Russ Cox | 8abcdee | 2009-06-06 19:27:48 -0700 | [diff] [blame] | 1001 | | LCHAN LCOMM non_chan_type |
Russ Cox | d364d28 | 2008-10-07 12:36:30 -0700 | [diff] [blame] | 1002 | { |
Russ Cox | be16caf | 2009-07-13 23:38:39 -0700 | [diff] [blame] | 1003 | $$ = nod(OTCHAN, $3, N); |
| 1004 | $$->etype = Csend; |
Russ Cox | d364d28 | 2008-10-07 12:36:30 -0700 | [diff] [blame] | 1005 | } |
Russ Cox | be16caf | 2009-07-13 23:38:39 -0700 | [diff] [blame] | 1006 | | LMAP '[' ntype ']' ntype |
Russ Cox | d364d28 | 2008-10-07 12:36:30 -0700 | [diff] [blame] | 1007 | { |
Russ Cox | be16caf | 2009-07-13 23:38:39 -0700 | [diff] [blame] | 1008 | $$ = nod(OTMAP, $3, $5); |
Russ Cox | d364d28 | 2008-10-07 12:36:30 -0700 | [diff] [blame] | 1009 | } |
Russ Cox | 35e5906 | 2009-07-17 14:42:14 -0700 | [diff] [blame] | 1010 | | structtype |
| 1011 | | interfacetype |
| 1012 | |
| 1013 | ptrtype: |
| 1014 | '*' ntype |
Russ Cox | d364d28 | 2008-10-07 12:36:30 -0700 | [diff] [blame] | 1015 | { |
Russ Cox | be16caf | 2009-07-13 23:38:39 -0700 | [diff] [blame] | 1016 | $$ = nod(OIND, $2, N); |
Russ Cox | d364d28 | 2008-10-07 12:36:30 -0700 | [diff] [blame] | 1017 | } |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1018 | |
Russ Cox | 8abcdee | 2009-06-06 19:27:48 -0700 | [diff] [blame] | 1019 | chantype: |
Russ Cox | be16caf | 2009-07-13 23:38:39 -0700 | [diff] [blame] | 1020 | LCHAN ntype |
Russ Cox | d364d28 | 2008-10-07 12:36:30 -0700 | [diff] [blame] | 1021 | { |
Russ Cox | be16caf | 2009-07-13 23:38:39 -0700 | [diff] [blame] | 1022 | $$ = nod(OTCHAN, $2, N); |
| 1023 | $$->etype = Cboth; |
Russ Cox | d364d28 | 2008-10-07 12:36:30 -0700 | [diff] [blame] | 1024 | } |
Ken Thompson | 0194aaf | 2008-09-05 19:50:34 -0700 | [diff] [blame] | 1025 | |
| 1026 | structtype: |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1027 | LSTRUCT '{' structdcl_list osemi '}' |
Ken Thompson | 0194aaf | 2008-09-05 19:50:34 -0700 | [diff] [blame] | 1028 | { |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1029 | $$ = nod(OTSTRUCT, N, N); |
| 1030 | $$->list = $3; |
Ken Thompson | 0194aaf | 2008-09-05 19:50:34 -0700 | [diff] [blame] | 1031 | } |
| 1032 | | LSTRUCT '{' '}' |
| 1033 | { |
Russ Cox | be16caf | 2009-07-13 23:38:39 -0700 | [diff] [blame] | 1034 | $$ = nod(OTSTRUCT, N, N); |
Ken Thompson | 0194aaf | 2008-09-05 19:50:34 -0700 | [diff] [blame] | 1035 | } |
| 1036 | |
| 1037 | interfacetype: |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1038 | LINTERFACE '{' interfacedcl_list osemi '}' |
Ken Thompson | 0194aaf | 2008-09-05 19:50:34 -0700 | [diff] [blame] | 1039 | { |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1040 | $$ = nod(OTINTER, N, N); |
| 1041 | $$->list = $3; |
Ken Thompson | 0194aaf | 2008-09-05 19:50:34 -0700 | [diff] [blame] | 1042 | } |
| 1043 | | LINTERFACE '{' '}' |
| 1044 | { |
Russ Cox | be16caf | 2009-07-13 23:38:39 -0700 | [diff] [blame] | 1045 | $$ = nod(OTINTER, N, N); |
Ken Thompson | 0194aaf | 2008-09-05 19:50:34 -0700 | [diff] [blame] | 1046 | } |
| 1047 | |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1048 | keyval: |
| 1049 | expr ':' expr |
| 1050 | { |
Ken Thompson | 182f91f | 2008-09-03 14:40:22 -0700 | [diff] [blame] | 1051 | $$ = nod(OKEY, $1, $3); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1052 | } |
Russ Cox | c2fa45b | 2009-05-21 16:31:10 -0700 | [diff] [blame] | 1053 | |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1054 | |
| 1055 | /* |
| 1056 | * function stuff |
| 1057 | * all in one place to show how crappy it all is |
| 1058 | */ |
| 1059 | xfndcl: |
Russ Cox | b648716 | 2009-08-07 12:50:26 -0700 | [diff] [blame] | 1060 | LFUNC fndcl fnbody |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1061 | { |
Russ Cox | b648716 | 2009-08-07 12:50:26 -0700 | [diff] [blame] | 1062 | $$ = $2; |
Russ Cox | a338231 | 2009-11-15 12:57:09 -0800 | [diff] [blame] | 1063 | if($$ == N) |
| 1064 | break; |
Russ Cox | b648716 | 2009-08-07 12:50:26 -0700 | [diff] [blame] | 1065 | $$->nbody = $3; |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1066 | funcbody($$); |
| 1067 | } |
| 1068 | |
| 1069 | fndcl: |
Russ Cox | 3997495 | 2009-12-11 15:59:41 -0800 | [diff] [blame^] | 1070 | dcl_name '(' oarg_type_list_ocomma ')' fnres |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1071 | { |
Russ Cox | 35e5906 | 2009-07-17 14:42:14 -0700 | [diff] [blame] | 1072 | Node *n; |
| 1073 | |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1074 | $$ = nod(ODCLFUNC, N, N); |
| 1075 | $$->nname = $1; |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1076 | if($3 == nil && $5 == nil) |
Ken Thompson | f24f8ff | 2008-07-19 18:39:12 -0700 | [diff] [blame] | 1077 | $$->nname = renameinit($1); |
Russ Cox | 35e5906 | 2009-07-17 14:42:14 -0700 | [diff] [blame] | 1078 | n = nod(OTFUNC, N, N); |
| 1079 | n->list = $3; |
| 1080 | n->rlist = $5; |
Russ Cox | b648716 | 2009-08-07 12:50:26 -0700 | [diff] [blame] | 1081 | // TODO: check if nname already has an ntype |
| 1082 | $$->nname->ntype = n; |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1083 | funchdr($$); |
| 1084 | } |
Russ Cox | 3997495 | 2009-12-11 15:59:41 -0800 | [diff] [blame^] | 1085 | | '(' oarg_type_list_ocomma ')' new_name '(' oarg_type_list_ocomma ')' fnres |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1086 | { |
Russ Cox | b648716 | 2009-08-07 12:50:26 -0700 | [diff] [blame] | 1087 | Node *rcvr, *t; |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1088 | |
Russ Cox | a338231 | 2009-11-15 12:57:09 -0800 | [diff] [blame] | 1089 | $$ = N; |
| 1090 | if($2 == nil) { |
| 1091 | yyerror("method has no receiver"); |
| 1092 | break; |
| 1093 | } |
| 1094 | if($2->next != nil) { |
| 1095 | yyerror("method has multiple receivers"); |
| 1096 | break; |
| 1097 | } |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1098 | rcvr = $2->n; |
Russ Cox | a338231 | 2009-11-15 12:57:09 -0800 | [diff] [blame] | 1099 | if(rcvr->op != ODCLFIELD) { |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1100 | yyerror("bad receiver in method"); |
Russ Cox | a338231 | 2009-11-15 12:57:09 -0800 | [diff] [blame] | 1101 | break; |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1102 | } |
| 1103 | |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1104 | $$ = nod(ODCLFUNC, N, N); |
Russ Cox | b648716 | 2009-08-07 12:50:26 -0700 | [diff] [blame] | 1105 | $$->nname = methodname1($4, rcvr->right); |
| 1106 | t = nod(OTFUNC, rcvr, N); |
| 1107 | t->list = $6; |
| 1108 | t->rlist = $8; |
| 1109 | $$->nname->ntype = t; |
| 1110 | $$->shortname = $4; |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1111 | funchdr($$); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1112 | } |
| 1113 | |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1114 | fntype: |
Russ Cox | 3997495 | 2009-12-11 15:59:41 -0800 | [diff] [blame^] | 1115 | LFUNC '(' oarg_type_list_ocomma ')' fnres |
Ken Thompson | 0194aaf | 2008-09-05 19:50:34 -0700 | [diff] [blame] | 1116 | { |
Russ Cox | db508ccbf | 2009-07-17 13:38:16 -0700 | [diff] [blame] | 1117 | $$ = nod(OTFUNC, N, N); |
| 1118 | $$->list = $3; |
| 1119 | $$->rlist = $5; |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1120 | } |
| 1121 | |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1122 | fnbody: |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1123 | { |
| 1124 | $$ = nil; |
| 1125 | } |
| 1126 | | '{' stmt_list '}' |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1127 | { |
Ken Thompson | 417a971 | 2008-07-05 12:49:25 -0700 | [diff] [blame] | 1128 | $$ = $2; |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1129 | if($$ == nil) |
Russ Cox | 0b2683d | 2009-07-27 14:36:32 -0700 | [diff] [blame] | 1130 | $$ = list1(nod(OEMPTY, N, N)); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1131 | } |
Ken Thompson | 417a971 | 2008-07-05 12:49:25 -0700 | [diff] [blame] | 1132 | |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1133 | fnres: |
Russ Cox | 63985b4 | 2009-03-05 15:57:03 -0800 | [diff] [blame] | 1134 | %prec NotParen |
Russ Cox | d364d28 | 2008-10-07 12:36:30 -0700 | [diff] [blame] | 1135 | { |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1136 | $$ = nil; |
Russ Cox | d364d28 | 2008-10-07 12:36:30 -0700 | [diff] [blame] | 1137 | } |
Russ Cox | 8abcdee | 2009-06-06 19:27:48 -0700 | [diff] [blame] | 1138 | | non_fn_type |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1139 | { |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1140 | $$ = list1(nod(ODCLFIELD, N, $1)); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1141 | } |
Russ Cox | 3997495 | 2009-12-11 15:59:41 -0800 | [diff] [blame^] | 1142 | | '(' oarg_type_list_ocomma ')' |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1143 | { |
| 1144 | $$ = $2; |
| 1145 | } |
| 1146 | |
Russ Cox | b648716 | 2009-08-07 12:50:26 -0700 | [diff] [blame] | 1147 | fnlitdcl: |
| 1148 | fntype |
| 1149 | { |
| 1150 | closurehdr($1); |
| 1151 | } |
| 1152 | |
| 1153 | fnliteral: |
| 1154 | fnlitdcl '{' stmt_list '}' |
| 1155 | { |
| 1156 | $$ = closurebody($3); |
| 1157 | } |
| 1158 | |
| 1159 | |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1160 | /* |
| 1161 | * lists of things |
| 1162 | * note that they are left recursive |
| 1163 | * to conserve yacc stack. they need to |
| 1164 | * be reversed to interpret correctly |
| 1165 | */ |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1166 | xdcl_list: |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1167 | { |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1168 | $$ = nil; |
| 1169 | } |
Russ Cox | 3997495 | 2009-12-11 15:59:41 -0800 | [diff] [blame^] | 1170 | | xdcl_list xdcl ';' |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1171 | { |
| 1172 | $$ = concat($1, $2); |
Russ Cox | 2372408 | 2009-10-12 11:03:48 -0700 | [diff] [blame] | 1173 | if(nsyntaxerrors == 0) |
| 1174 | testdclstack(); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1175 | } |
| 1176 | |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1177 | vardcl_list: |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1178 | vardcl |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1179 | | vardcl_list ';' vardcl |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1180 | { |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1181 | $$ = concat($1, $3); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1182 | } |
| 1183 | |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1184 | constdcl_list: |
Ken Thompson | 9dbaab5 | 2008-09-04 12:21:10 -0700 | [diff] [blame] | 1185 | constdcl1 |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1186 | | constdcl_list ';' constdcl1 |
Russ Cox | db508ccbf | 2009-07-17 13:38:16 -0700 | [diff] [blame] | 1187 | { |
| 1188 | $$ = concat($1, $3); |
| 1189 | } |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1190 | |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1191 | typedcl_list: |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1192 | typedcl |
Russ Cox | db508ccbf | 2009-07-17 13:38:16 -0700 | [diff] [blame] | 1193 | { |
| 1194 | $$ = list1($1); |
| 1195 | } |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1196 | | typedcl_list ';' typedcl |
Russ Cox | db508ccbf | 2009-07-17 13:38:16 -0700 | [diff] [blame] | 1197 | { |
| 1198 | $$ = list($1, $3); |
| 1199 | } |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1200 | |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1201 | structdcl_list: |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1202 | structdcl |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1203 | | structdcl_list ';' structdcl |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1204 | { |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1205 | $$ = concat($1, $3); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1206 | } |
| 1207 | |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1208 | interfacedcl_list: |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1209 | interfacedcl |
Russ Cox | 7743ffe | 2009-09-28 14:05:34 -0700 | [diff] [blame] | 1210 | { |
| 1211 | $$ = list1($1); |
| 1212 | } |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1213 | | interfacedcl_list ';' interfacedcl |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1214 | { |
Russ Cox | 7743ffe | 2009-09-28 14:05:34 -0700 | [diff] [blame] | 1215 | $$ = list($1, $3); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1216 | } |
| 1217 | |
| 1218 | structdcl: |
Russ Cox | db508ccbf | 2009-07-17 13:38:16 -0700 | [diff] [blame] | 1219 | new_name_list ntype oliteral |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1220 | { |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1221 | NodeList *l; |
| 1222 | |
| 1223 | for(l=$1; l; l=l->next) { |
| 1224 | l->n = nod(ODCLFIELD, l->n, $2); |
| 1225 | l->n->val = $3; |
| 1226 | } |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1227 | } |
Russ Cox | f2b15363 | 2008-10-30 15:29:55 -0700 | [diff] [blame] | 1228 | | embed oliteral |
| 1229 | { |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1230 | $1->val = $2; |
| 1231 | $$ = list1($1); |
Russ Cox | f2b15363 | 2008-10-30 15:29:55 -0700 | [diff] [blame] | 1232 | } |
| 1233 | | '*' embed oliteral |
Ken Thompson | 9f3d600 | 2008-09-26 21:27:26 -0700 | [diff] [blame] | 1234 | { |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1235 | $2->right = nod(OIND, $2->right, N); |
| 1236 | $2->val = $3; |
| 1237 | $$ = list1($2); |
Ken Thompson | 0347e95 | 2008-10-21 15:04:10 -0700 | [diff] [blame] | 1238 | } |
| 1239 | |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 1240 | packname: |
| 1241 | LNAME |
Russ Cox | 73e52ae | 2009-09-17 16:42:10 -0700 | [diff] [blame] | 1242 | { |
| 1243 | Node *n; |
| 1244 | |
| 1245 | $$ = $1; |
| 1246 | n = oldname($1); |
| 1247 | if(n->pack != N) |
| 1248 | n->pack->used = 1; |
| 1249 | } |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 1250 | | LNAME '.' sym |
| 1251 | { |
| 1252 | char *pkg; |
| 1253 | |
| 1254 | if($1->def == N || $1->def->op != OPACK) { |
| 1255 | yyerror("%S is not a package", $1); |
| 1256 | pkg = $1->name; |
Russ Cox | 73e52ae | 2009-09-17 16:42:10 -0700 | [diff] [blame] | 1257 | } else { |
| 1258 | $1->def->used = 1; |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 1259 | pkg = $1->def->sym->name; |
Russ Cox | 73e52ae | 2009-09-17 16:42:10 -0700 | [diff] [blame] | 1260 | } |
Russ Cox | be16caf | 2009-07-13 23:38:39 -0700 | [diff] [blame] | 1261 | $$ = restrictlookup($3->name, pkg); |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 1262 | } |
| 1263 | |
Ken Thompson | 14c6391 | 2008-10-21 20:55:40 -0700 | [diff] [blame] | 1264 | embed: |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 1265 | packname |
Ken Thompson | 0347e95 | 2008-10-21 15:04:10 -0700 | [diff] [blame] | 1266 | { |
Ken Thompson | 14c6391 | 2008-10-21 20:55:40 -0700 | [diff] [blame] | 1267 | $$ = embedded($1); |
Ken Thompson | 61361af | 2008-10-19 20:13:37 -0700 | [diff] [blame] | 1268 | } |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1269 | |
Russ Cox | b4af09a | 2009-02-16 16:36:18 -0800 | [diff] [blame] | 1270 | interfacedcl: |
Russ Cox | 7743ffe | 2009-09-28 14:05:34 -0700 | [diff] [blame] | 1271 | new_name indcl |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1272 | { |
Russ Cox | 7743ffe | 2009-09-28 14:05:34 -0700 | [diff] [blame] | 1273 | $$ = nod(ODCLFIELD, $1, $2); |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1274 | } |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 1275 | | packname |
Russ Cox | b4af09a | 2009-02-16 16:36:18 -0800 | [diff] [blame] | 1276 | { |
Russ Cox | 7743ffe | 2009-09-28 14:05:34 -0700 | [diff] [blame] | 1277 | $$ = nod(ODCLFIELD, N, oldname($1)); |
Russ Cox | b4af09a | 2009-02-16 16:36:18 -0800 | [diff] [blame] | 1278 | } |
| 1279 | |
Ken Thompson | 0194aaf | 2008-09-05 19:50:34 -0700 | [diff] [blame] | 1280 | indcl: |
Russ Cox | 3997495 | 2009-12-11 15:59:41 -0800 | [diff] [blame^] | 1281 | '(' oarg_type_list_ocomma ')' fnres |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1282 | { |
| 1283 | // without func keyword |
Russ Cox | 35e5906 | 2009-07-17 14:42:14 -0700 | [diff] [blame] | 1284 | $$ = nod(OTFUNC, fakethis(), N); |
| 1285 | $$->list = $2; |
| 1286 | $$->rlist = $4; |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1287 | } |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1288 | |
Russ Cox | 4d571c9 | 2008-09-30 12:53:11 -0700 | [diff] [blame] | 1289 | /* |
| 1290 | * function arguments. |
Russ Cox | 4d571c9 | 2008-09-30 12:53:11 -0700 | [diff] [blame] | 1291 | */ |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 1292 | arg_type: |
| 1293 | name_or_type |
| 1294 | | sym name_or_type |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1295 | { |
Russ Cox | 5d16d23 | 2009-09-09 00:18:16 -0700 | [diff] [blame] | 1296 | $$ = nod(ONONAME, N, N); |
| 1297 | $$->sym = $1; |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 1298 | $$ = nod(OKEY, $$, $2); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1299 | } |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 1300 | | sym dotdotdot |
Ken Thompson | c21d9a1 | 2008-10-29 12:46:44 -0700 | [diff] [blame] | 1301 | { |
Russ Cox | 5d16d23 | 2009-09-09 00:18:16 -0700 | [diff] [blame] | 1302 | $$ = nod(ONONAME, N, N); |
| 1303 | $$->sym = $1; |
Russ Cox | be16caf | 2009-07-13 23:38:39 -0700 | [diff] [blame] | 1304 | $$ = nod(OKEY, $$, $2); |
Ken Thompson | c21d9a1 | 2008-10-29 12:46:44 -0700 | [diff] [blame] | 1305 | } |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 1306 | | dotdotdot |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1307 | |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1308 | arg_type_list: |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 1309 | arg_type |
Russ Cox | 4d571c9 | 2008-09-30 12:53:11 -0700 | [diff] [blame] | 1310 | { |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1311 | $$ = list1($1); |
| 1312 | } |
| 1313 | | arg_type_list ',' arg_type |
| 1314 | { |
| 1315 | $$ = list($1, $3); |
Russ Cox | 4d571c9 | 2008-09-30 12:53:11 -0700 | [diff] [blame] | 1316 | } |
| 1317 | |
Russ Cox | 3997495 | 2009-12-11 15:59:41 -0800 | [diff] [blame^] | 1318 | oarg_type_list_ocomma: |
Russ Cox | 4d571c9 | 2008-09-30 12:53:11 -0700 | [diff] [blame] | 1319 | { |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1320 | $$ = nil; |
| 1321 | } |
Russ Cox | 3997495 | 2009-12-11 15:59:41 -0800 | [diff] [blame^] | 1322 | | arg_type_list ocomma |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1323 | { |
| 1324 | $$ = checkarglist($1); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1325 | } |
| 1326 | |
Ken Thompson | 36bfd2a | 2008-06-08 16:11:14 -0700 | [diff] [blame] | 1327 | /* |
Russ Cox | 8abcdee | 2009-06-06 19:27:48 -0700 | [diff] [blame] | 1328 | * statement |
Ken Thompson | 36bfd2a | 2008-06-08 16:11:14 -0700 | [diff] [blame] | 1329 | */ |
Russ Cox | 8abcdee | 2009-06-06 19:27:48 -0700 | [diff] [blame] | 1330 | stmt: |
Ken Thompson | 610644a | 2008-06-08 17:21:46 -0700 | [diff] [blame] | 1331 | { |
| 1332 | $$ = N; |
| 1333 | } |
Russ Cox | d364d28 | 2008-10-07 12:36:30 -0700 | [diff] [blame] | 1334 | | simple_stmt |
Russ Cox | 8abcdee | 2009-06-06 19:27:48 -0700 | [diff] [blame] | 1335 | | compound_stmt |
| 1336 | | common_dcl |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1337 | { |
| 1338 | $$ = liststmt($1); |
| 1339 | } |
Russ Cox | 8abcdee | 2009-06-06 19:27:48 -0700 | [diff] [blame] | 1340 | | for_stmt |
| 1341 | | switch_stmt |
| 1342 | | select_stmt |
| 1343 | | if_stmt |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1344 | { |
Russ Cox | 8abcdee | 2009-06-06 19:27:48 -0700 | [diff] [blame] | 1345 | popdcl(); |
| 1346 | $$ = $1; |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1347 | } |
Russ Cox | 8abcdee | 2009-06-06 19:27:48 -0700 | [diff] [blame] | 1348 | | if_stmt LELSE stmt |
Ken Thompson | 8200a0b | 2008-06-08 12:48:37 -0700 | [diff] [blame] | 1349 | { |
Russ Cox | 8abcdee | 2009-06-06 19:27:48 -0700 | [diff] [blame] | 1350 | popdcl(); |
| 1351 | $$ = $1; |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1352 | $$->nelse = list1($3); |
Russ Cox | 8abcdee | 2009-06-06 19:27:48 -0700 | [diff] [blame] | 1353 | } |
| 1354 | | error |
| 1355 | { |
| 1356 | $$ = N; |
| 1357 | } |
| 1358 | | labelname ':' stmt |
| 1359 | { |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1360 | NodeList *l; |
| 1361 | |
Russ Cox | 62c4818 | 2009-10-19 20:39:18 -0700 | [diff] [blame] | 1362 | l = list1(nod(OLABEL, $1, $3)); |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1363 | if($3) |
| 1364 | l = list(l, $3); |
| 1365 | $$ = liststmt(l); |
Russ Cox | 8abcdee | 2009-06-06 19:27:48 -0700 | [diff] [blame] | 1366 | } |
| 1367 | | LFALL |
| 1368 | { |
| 1369 | // will be converted to OFALL |
| 1370 | $$ = nod(OXFALL, N, N); |
| 1371 | } |
| 1372 | | LBREAK onew_name |
| 1373 | { |
| 1374 | $$ = nod(OBREAK, $2, N); |
| 1375 | } |
| 1376 | | LCONTINUE onew_name |
| 1377 | { |
| 1378 | $$ = nod(OCONTINUE, $2, N); |
| 1379 | } |
| 1380 | | LGO pseudocall |
| 1381 | { |
| 1382 | $$ = nod(OPROC, $2, N); |
| 1383 | } |
| 1384 | | LDEFER pseudocall |
| 1385 | { |
| 1386 | $$ = nod(ODEFER, $2, N); |
| 1387 | } |
| 1388 | | LGOTO new_name |
| 1389 | { |
| 1390 | $$ = nod(OGOTO, $2, N); |
| 1391 | } |
| 1392 | | LRETURN oexpr_list |
| 1393 | { |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1394 | $$ = nod(ORETURN, N, N); |
| 1395 | $$->list = $2; |
Ken Thompson | 8200a0b | 2008-06-08 12:48:37 -0700 | [diff] [blame] | 1396 | } |
Ken Thompson | 8200a0b | 2008-06-08 12:48:37 -0700 | [diff] [blame] | 1397 | |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1398 | stmt_list: |
Russ Cox | 8abcdee | 2009-06-06 19:27:48 -0700 | [diff] [blame] | 1399 | stmt |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1400 | { |
| 1401 | $$ = nil; |
| 1402 | if($1 != N) |
| 1403 | $$ = list1($1); |
| 1404 | } |
| 1405 | | stmt_list ';' stmt |
| 1406 | { |
| 1407 | $$ = $1; |
| 1408 | if($3 != N) |
| 1409 | $$ = list($$, $3); |
| 1410 | } |
| 1411 | |
Russ Cox | db508ccbf | 2009-07-17 13:38:16 -0700 | [diff] [blame] | 1412 | new_name_list: |
| 1413 | new_name |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1414 | { |
Russ Cox | db508ccbf | 2009-07-17 13:38:16 -0700 | [diff] [blame] | 1415 | $$ = list1($1); |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1416 | } |
Russ Cox | db508ccbf | 2009-07-17 13:38:16 -0700 | [diff] [blame] | 1417 | | new_name_list ',' new_name |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1418 | { |
Russ Cox | db508ccbf | 2009-07-17 13:38:16 -0700 | [diff] [blame] | 1419 | $$ = list($1, $3); |
| 1420 | } |
| 1421 | |
| 1422 | dcl_name_list: |
| 1423 | dcl_name |
| 1424 | { |
| 1425 | $$ = list1($1); |
| 1426 | } |
| 1427 | | dcl_name_list ',' dcl_name |
| 1428 | { |
| 1429 | $$ = list($1, $3); |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1430 | } |
| 1431 | |
| 1432 | expr_list: |
| 1433 | expr |
| 1434 | { |
| 1435 | $$ = list1($1); |
| 1436 | } |
| 1437 | | expr_list ',' expr |
Russ Cox | 8abcdee | 2009-06-06 19:27:48 -0700 | [diff] [blame] | 1438 | { |
| 1439 | $$ = list($1, $3); |
| 1440 | } |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1441 | |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1442 | expr_or_type_list: |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 1443 | expr_or_type |
Ken Thompson | e8278bc | 2008-10-26 14:04:09 -0700 | [diff] [blame] | 1444 | { |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1445 | $$ = list1($1); |
Ken Thompson | e8278bc | 2008-10-26 14:04:09 -0700 | [diff] [blame] | 1446 | } |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1447 | | expr_or_type_list ',' expr_or_type |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1448 | { |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1449 | $$ = list($1, $3); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1450 | } |
| 1451 | |
Ken Thompson | a016081 | 2009-05-21 13:46:07 -0700 | [diff] [blame] | 1452 | /* |
| 1453 | * list of combo of keyval and val |
| 1454 | */ |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1455 | keyval_list: |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1456 | keyval |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1457 | { |
| 1458 | $$ = list1($1); |
| 1459 | } |
Ken Thompson | a016081 | 2009-05-21 13:46:07 -0700 | [diff] [blame] | 1460 | | expr |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1461 | { |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1462 | $$ = list1($1); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1463 | } |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1464 | | keyval_list ',' keyval |
Ken Thompson | a016081 | 2009-05-21 13:46:07 -0700 | [diff] [blame] | 1465 | { |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1466 | $$ = list($1, $3); |
| 1467 | } |
| 1468 | | keyval_list ',' expr |
| 1469 | { |
| 1470 | $$ = list($1, $3); |
Ken Thompson | a016081 | 2009-05-21 13:46:07 -0700 | [diff] [blame] | 1471 | } |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1472 | |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1473 | braced_keyval_list: |
Russ Cox | 82e41cc | 2008-10-14 17:10:39 -0700 | [diff] [blame] | 1474 | { |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1475 | $$ = nil; |
Russ Cox | 82e41cc | 2008-10-14 17:10:39 -0700 | [diff] [blame] | 1476 | } |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1477 | | keyval_list ocomma |
Russ Cox | 82e41cc | 2008-10-14 17:10:39 -0700 | [diff] [blame] | 1478 | { |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1479 | $$ = $1; |
Russ Cox | 82e41cc | 2008-10-14 17:10:39 -0700 | [diff] [blame] | 1480 | } |
Russ Cox | 82e41cc | 2008-10-14 17:10:39 -0700 | [diff] [blame] | 1481 | |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1482 | /* |
| 1483 | * optional things |
| 1484 | */ |
| 1485 | osemi: |
| 1486 | | ';' |
| 1487 | |
| 1488 | ocomma: |
| 1489 | | ',' |
| 1490 | |
| 1491 | oexpr: |
| 1492 | { |
| 1493 | $$ = N; |
| 1494 | } |
| 1495 | | expr |
| 1496 | |
| 1497 | oexpr_list: |
| 1498 | { |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1499 | $$ = nil; |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1500 | } |
| 1501 | | expr_list |
| 1502 | |
Russ Cox | 3997495 | 2009-12-11 15:59:41 -0800 | [diff] [blame^] | 1503 | oexpr_or_type_list_ocomma: |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 1504 | { |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1505 | $$ = nil; |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 1506 | } |
Russ Cox | 3997495 | 2009-12-11 15:59:41 -0800 | [diff] [blame^] | 1507 | | expr_or_type_list ocomma |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 1508 | |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1509 | osimple_stmt: |
| 1510 | { |
| 1511 | $$ = N; |
| 1512 | } |
| 1513 | | simple_stmt |
| 1514 | |
Russ Cox | b8babed | 2008-10-03 16:15:55 -0700 | [diff] [blame] | 1515 | ohidden_funarg_list: |
| 1516 | { |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1517 | $$ = nil; |
Russ Cox | b8babed | 2008-10-03 16:15:55 -0700 | [diff] [blame] | 1518 | } |
| 1519 | | hidden_funarg_list |
| 1520 | |
| 1521 | ohidden_structdcl_list: |
| 1522 | { |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1523 | $$ = nil; |
Russ Cox | b8babed | 2008-10-03 16:15:55 -0700 | [diff] [blame] | 1524 | } |
| 1525 | | hidden_structdcl_list |
| 1526 | |
| 1527 | ohidden_interfacedcl_list: |
| 1528 | { |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1529 | $$ = nil; |
Russ Cox | b8babed | 2008-10-03 16:15:55 -0700 | [diff] [blame] | 1530 | } |
| 1531 | | hidden_interfacedcl_list |
| 1532 | |
Russ Cox | f27aaf4 | 2008-10-30 15:13:09 -0700 | [diff] [blame] | 1533 | oliteral: |
| 1534 | { |
| 1535 | $$.ctype = CTxxx; |
| 1536 | } |
| 1537 | | LLITERAL |
| 1538 | |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1539 | /* |
| 1540 | * import syntax from header of |
| 1541 | * an output package |
| 1542 | */ |
| 1543 | hidden_import: |
Russ Cox | 3997495 | 2009-12-11 15:59:41 -0800 | [diff] [blame^] | 1544 | LPACKAGE sym ';' |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1545 | /* variables */ |
Russ Cox | 3997495 | 2009-12-11 15:59:41 -0800 | [diff] [blame^] | 1546 | | LVAR hidden_pkg_importsym hidden_type ';' |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1547 | { |
Russ Cox | 4a43198 | 2009-01-30 14:39:42 -0800 | [diff] [blame] | 1548 | importvar($2, $3, PEXTERN); |
Russ Cox | b8babed | 2008-10-03 16:15:55 -0700 | [diff] [blame] | 1549 | } |
Russ Cox | 3997495 | 2009-12-11 15:59:41 -0800 | [diff] [blame^] | 1550 | | LCONST hidden_pkg_importsym '=' hidden_constant ';' |
Russ Cox | b8babed | 2008-10-03 16:15:55 -0700 | [diff] [blame] | 1551 | { |
Russ Cox | 8f194bf | 2009-03-12 19:04:38 -0700 | [diff] [blame] | 1552 | importconst($2, types[TIDEAL], $4); |
Russ Cox | b8babed | 2008-10-03 16:15:55 -0700 | [diff] [blame] | 1553 | } |
Russ Cox | 3997495 | 2009-12-11 15:59:41 -0800 | [diff] [blame^] | 1554 | | LCONST hidden_pkg_importsym hidden_type '=' hidden_constant ';' |
Russ Cox | b8babed | 2008-10-03 16:15:55 -0700 | [diff] [blame] | 1555 | { |
Russ Cox | 8f194bf | 2009-03-12 19:04:38 -0700 | [diff] [blame] | 1556 | importconst($2, $3, $5); |
Russ Cox | b8babed | 2008-10-03 16:15:55 -0700 | [diff] [blame] | 1557 | } |
Russ Cox | 3997495 | 2009-12-11 15:59:41 -0800 | [diff] [blame^] | 1558 | | LTYPE hidden_pkgtype hidden_type ';' |
Russ Cox | b8babed | 2008-10-03 16:15:55 -0700 | [diff] [blame] | 1559 | { |
Russ Cox | 0183baa | 2009-01-20 14:40:00 -0800 | [diff] [blame] | 1560 | importtype($2, $3); |
Russ Cox | b8babed | 2008-10-03 16:15:55 -0700 | [diff] [blame] | 1561 | } |
Russ Cox | 3997495 | 2009-12-11 15:59:41 -0800 | [diff] [blame^] | 1562 | | LFUNC hidden_pkg_importsym '(' ohidden_funarg_list ')' ohidden_funres ';' |
Russ Cox | b8babed | 2008-10-03 16:15:55 -0700 | [diff] [blame] | 1563 | { |
Russ Cox | 4a43198 | 2009-01-30 14:39:42 -0800 | [diff] [blame] | 1564 | importvar($2, functype(N, $4, $6), PFUNC); |
Russ Cox | b8babed | 2008-10-03 16:15:55 -0700 | [diff] [blame] | 1565 | } |
Russ Cox | 3997495 | 2009-12-11 15:59:41 -0800 | [diff] [blame^] | 1566 | | LFUNC '(' hidden_funarg_list ')' sym '(' ohidden_funarg_list ')' ohidden_funres ';' |
Russ Cox | b8babed | 2008-10-03 16:15:55 -0700 | [diff] [blame] | 1567 | { |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1568 | if($3->next != nil || $3->n->op != ODCLFIELD) { |
Russ Cox | b8babed | 2008-10-03 16:15:55 -0700 | [diff] [blame] | 1569 | yyerror("bad receiver in method"); |
| 1570 | YYERROR; |
| 1571 | } |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1572 | importmethod($5, functype($3->n, $7, $9)); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1573 | } |
| 1574 | |
Russ Cox | b648716 | 2009-08-07 12:50:26 -0700 | [diff] [blame] | 1575 | hidden_pkgtype: |
| 1576 | hidden_pkg_importsym |
| 1577 | { |
| 1578 | $$ = pkgtype($1); |
| 1579 | importsym($1, OTYPE); |
| 1580 | } |
| 1581 | |
Russ Cox | b8babed | 2008-10-03 16:15:55 -0700 | [diff] [blame] | 1582 | hidden_type: |
Russ Cox | e733766 | 2009-12-03 00:10:32 -0800 | [diff] [blame] | 1583 | hidden_type_misc |
| 1584 | | hidden_type_chan |
| 1585 | | hidden_type_func |
Russ Cox | b8babed | 2008-10-03 16:15:55 -0700 | [diff] [blame] | 1586 | |
Russ Cox | e733766 | 2009-12-03 00:10:32 -0800 | [diff] [blame] | 1587 | hidden_type_non_chan: |
| 1588 | hidden_type_misc |
| 1589 | | hidden_type_func |
| 1590 | |
| 1591 | hidden_type_non_func: |
| 1592 | hidden_type_misc |
| 1593 | | hidden_type_chan |
| 1594 | |
| 1595 | hidden_type_misc: |
Russ Cox | b8babed | 2008-10-03 16:15:55 -0700 | [diff] [blame] | 1596 | hidden_importsym |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1597 | { |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 1598 | $$ = pkgtype($1); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1599 | } |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 1600 | | LNAME |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1601 | { |
Russ Cox | a121410 | 2009-08-04 22:59:23 -0700 | [diff] [blame] | 1602 | // predefined name like uint8 |
Russ Cox | e780fa8 | 2009-09-09 01:01:39 -0700 | [diff] [blame] | 1603 | $1 = pkglookup($1->name, "/builtin/"); |
Russ Cox | a121410 | 2009-08-04 22:59:23 -0700 | [diff] [blame] | 1604 | if($1->def == N || $1->def->op != OTYPE) { |
Russ Cox | e780fa8 | 2009-09-09 01:01:39 -0700 | [diff] [blame] | 1605 | yyerror("%s is not a type", $1->name); |
Russ Cox | a121410 | 2009-08-04 22:59:23 -0700 | [diff] [blame] | 1606 | $$ = T; |
| 1607 | } else |
| 1608 | $$ = $1->def->type; |
Russ Cox | b8babed | 2008-10-03 16:15:55 -0700 | [diff] [blame] | 1609 | } |
| 1610 | | '[' ']' hidden_type |
| 1611 | { |
| 1612 | $$ = aindex(N, $3); |
| 1613 | } |
| 1614 | | '[' LLITERAL ']' hidden_type |
| 1615 | { |
Russ Cox | 8f194bf | 2009-03-12 19:04:38 -0700 | [diff] [blame] | 1616 | $$ = aindex(nodlit($2), $4); |
Russ Cox | b8babed | 2008-10-03 16:15:55 -0700 | [diff] [blame] | 1617 | } |
| 1618 | | LMAP '[' hidden_type ']' hidden_type |
| 1619 | { |
Russ Cox | 98b34e5 | 2009-03-04 17:38:37 -0800 | [diff] [blame] | 1620 | $$ = maptype($3, $5); |
Russ Cox | b8babed | 2008-10-03 16:15:55 -0700 | [diff] [blame] | 1621 | } |
| 1622 | | LSTRUCT '{' ohidden_structdcl_list '}' |
| 1623 | { |
| 1624 | $$ = dostruct($3, TSTRUCT); |
| 1625 | } |
| 1626 | | LINTERFACE '{' ohidden_interfacedcl_list '}' |
| 1627 | { |
| 1628 | $$ = dostruct($3, TINTER); |
| 1629 | $$ = sortinter($$); |
| 1630 | } |
| 1631 | | '*' hidden_type |
| 1632 | { |
Russ Cox | b8babed | 2008-10-03 16:15:55 -0700 | [diff] [blame] | 1633 | $$ = ptrto($2); |
| 1634 | } |
| 1635 | | LCOMM LCHAN hidden_type |
| 1636 | { |
| 1637 | $$ = typ(TCHAN); |
| 1638 | $$->type = $3; |
| 1639 | $$->chan = Crecv; |
| 1640 | } |
Russ Cox | e733766 | 2009-12-03 00:10:32 -0800 | [diff] [blame] | 1641 | | LCHAN LCOMM hidden_type_non_chan |
Russ Cox | b8babed | 2008-10-03 16:15:55 -0700 | [diff] [blame] | 1642 | { |
| 1643 | $$ = typ(TCHAN); |
| 1644 | $$->type = $3; |
| 1645 | $$->chan = Csend; |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1646 | } |
Russ Cox | e733766 | 2009-12-03 00:10:32 -0800 | [diff] [blame] | 1647 | | LCHAN LCOMM '(' hidden_type_chan ')' |
| 1648 | { |
| 1649 | $$ = typ(TCHAN); |
| 1650 | $$->type = $4; |
| 1651 | $$->chan = Csend; |
| 1652 | } |
Ken Thompson | 2fef4c7 | 2008-11-01 16:52:12 -0700 | [diff] [blame] | 1653 | | LDDD |
| 1654 | { |
| 1655 | $$ = typ(TDDD); |
| 1656 | } |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1657 | |
Russ Cox | e733766 | 2009-12-03 00:10:32 -0800 | [diff] [blame] | 1658 | hidden_type_chan: |
Russ Cox | b8babed | 2008-10-03 16:15:55 -0700 | [diff] [blame] | 1659 | LCHAN hidden_type |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1660 | { |
Russ Cox | b8babed | 2008-10-03 16:15:55 -0700 | [diff] [blame] | 1661 | $$ = typ(TCHAN); |
| 1662 | $$->type = $2; |
| 1663 | $$->chan = Cboth; |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1664 | } |
Russ Cox | e733766 | 2009-12-03 00:10:32 -0800 | [diff] [blame] | 1665 | |
| 1666 | hidden_type_func: |
| 1667 | LFUNC '(' ohidden_funarg_list ')' ohidden_funres |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1668 | { |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1669 | $$ = functype(nil, $3, $5); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1670 | } |
Russ Cox | b8babed | 2008-10-03 16:15:55 -0700 | [diff] [blame] | 1671 | |
| 1672 | hidden_dcl: |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 1673 | sym hidden_type |
Ken Thompson | 66a603c | 2008-08-27 17:28:30 -0700 | [diff] [blame] | 1674 | { |
Russ Cox | b648716 | 2009-08-07 12:50:26 -0700 | [diff] [blame] | 1675 | $$ = nod(ODCLFIELD, newname($1), typenod($2)); |
Ken Thompson | 66a603c | 2008-08-27 17:28:30 -0700 | [diff] [blame] | 1676 | } |
Russ Cox | b8babed | 2008-10-03 16:15:55 -0700 | [diff] [blame] | 1677 | | '?' hidden_type |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1678 | { |
Russ Cox | b648716 | 2009-08-07 12:50:26 -0700 | [diff] [blame] | 1679 | $$ = nod(ODCLFIELD, N, typenod($2)); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1680 | } |
Russ Cox | b8babed | 2008-10-03 16:15:55 -0700 | [diff] [blame] | 1681 | |
Russ Cox | 2161725 | 2008-10-22 13:22:56 -0700 | [diff] [blame] | 1682 | hidden_structdcl: |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 1683 | sym hidden_type oliteral |
Russ Cox | 2161725 | 2008-10-22 13:22:56 -0700 | [diff] [blame] | 1684 | { |
Russ Cox | be16caf | 2009-07-13 23:38:39 -0700 | [diff] [blame] | 1685 | $$ = nod(ODCLFIELD, newname($1), typenod($2)); |
Russ Cox | 1850b29 | 2008-10-30 15:25:26 -0700 | [diff] [blame] | 1686 | $$->val = $3; |
Russ Cox | 2161725 | 2008-10-22 13:22:56 -0700 | [diff] [blame] | 1687 | } |
Russ Cox | f2b15363 | 2008-10-30 15:29:55 -0700 | [diff] [blame] | 1688 | | '?' hidden_type oliteral |
Russ Cox | 2161725 | 2008-10-22 13:22:56 -0700 | [diff] [blame] | 1689 | { |
Russ Cox | e780fa8 | 2009-09-09 01:01:39 -0700 | [diff] [blame] | 1690 | Sym *s; |
| 1691 | |
| 1692 | s = $2->sym; |
| 1693 | if(s == S && isptr[$2->etype]) |
| 1694 | s = $2->type->sym; |
| 1695 | if(s && strcmp(s->package, "/builtin/") == 0) |
| 1696 | s = lookup(s->name); |
| 1697 | $$ = embedded(s); |
| 1698 | $$->right = typenod($2); |
Russ Cox | f2b15363 | 2008-10-30 15:29:55 -0700 | [diff] [blame] | 1699 | $$->val = $3; |
Russ Cox | 2161725 | 2008-10-22 13:22:56 -0700 | [diff] [blame] | 1700 | } |
| 1701 | |
Russ Cox | b8babed | 2008-10-03 16:15:55 -0700 | [diff] [blame] | 1702 | hidden_interfacedcl: |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 1703 | sym '(' ohidden_funarg_list ')' ohidden_funres |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1704 | { |
Russ Cox | be16caf | 2009-07-13 23:38:39 -0700 | [diff] [blame] | 1705 | $$ = nod(ODCLFIELD, newname($1), typenod(functype(fakethis(), $3, $5))); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1706 | } |
Russ Cox | b8babed | 2008-10-03 16:15:55 -0700 | [diff] [blame] | 1707 | |
| 1708 | ohidden_funres: |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1709 | { |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1710 | $$ = nil; |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1711 | } |
Russ Cox | b8babed | 2008-10-03 16:15:55 -0700 | [diff] [blame] | 1712 | | hidden_funres |
| 1713 | |
| 1714 | hidden_funres: |
| 1715 | '(' ohidden_funarg_list ')' |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1716 | { |
Russ Cox | b8babed | 2008-10-03 16:15:55 -0700 | [diff] [blame] | 1717 | $$ = $2; |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1718 | } |
Russ Cox | e733766 | 2009-12-03 00:10:32 -0800 | [diff] [blame] | 1719 | | hidden_type_non_func |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1720 | { |
Russ Cox | b648716 | 2009-08-07 12:50:26 -0700 | [diff] [blame] | 1721 | $$ = list1(nod(ODCLFIELD, N, typenod($1))); |
Ken Thompson | 2119294 | 2008-09-14 16:57:55 -0700 | [diff] [blame] | 1722 | } |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1723 | |
Russ Cox | c3d841f | 2008-09-26 11:44:20 -0700 | [diff] [blame] | 1724 | hidden_constant: |
| 1725 | LLITERAL |
Russ Cox | 8f194bf | 2009-03-12 19:04:38 -0700 | [diff] [blame] | 1726 | { |
| 1727 | $$ = nodlit($1); |
| 1728 | } |
Russ Cox | c3d841f | 2008-09-26 11:44:20 -0700 | [diff] [blame] | 1729 | | '-' LLITERAL |
| 1730 | { |
Russ Cox | 8f194bf | 2009-03-12 19:04:38 -0700 | [diff] [blame] | 1731 | $$ = nodlit($2); |
| 1732 | switch($$->val.ctype){ |
Russ Cox | c3d841f | 2008-09-26 11:44:20 -0700 | [diff] [blame] | 1733 | case CTINT: |
Russ Cox | 8f194bf | 2009-03-12 19:04:38 -0700 | [diff] [blame] | 1734 | mpnegfix($$->val.u.xval); |
Russ Cox | c3d841f | 2008-09-26 11:44:20 -0700 | [diff] [blame] | 1735 | break; |
| 1736 | case CTFLT: |
Russ Cox | 8f194bf | 2009-03-12 19:04:38 -0700 | [diff] [blame] | 1737 | mpnegflt($$->val.u.fval); |
Russ Cox | c3d841f | 2008-09-26 11:44:20 -0700 | [diff] [blame] | 1738 | break; |
| 1739 | default: |
| 1740 | yyerror("bad negated constant"); |
| 1741 | } |
| 1742 | } |
Russ Cox | e780fa8 | 2009-09-09 01:01:39 -0700 | [diff] [blame] | 1743 | | sym |
Russ Cox | dec12d3 | 2009-01-16 10:45:28 -0800 | [diff] [blame] | 1744 | { |
Russ Cox | e780fa8 | 2009-09-09 01:01:39 -0700 | [diff] [blame] | 1745 | $$ = oldname(pkglookup($1->name, "/builtin/")); |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 1746 | if($$->op != OLITERAL) |
| 1747 | yyerror("bad constant %S", $$->sym); |
Russ Cox | dec12d3 | 2009-01-16 10:45:28 -0800 | [diff] [blame] | 1748 | } |
Russ Cox | c3d841f | 2008-09-26 11:44:20 -0700 | [diff] [blame] | 1749 | |
Russ Cox | b8babed | 2008-10-03 16:15:55 -0700 | [diff] [blame] | 1750 | hidden_importsym: |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 1751 | sym '.' sym |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1752 | { |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 1753 | $$ = pkglookup($3->name, $1->name); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1754 | } |
Russ Cox | 13f3149 | 2008-09-18 13:32:14 -0700 | [diff] [blame] | 1755 | |
Russ Cox | 4efad58 | 2009-01-26 16:57:24 -0800 | [diff] [blame] | 1756 | hidden_pkg_importsym: |
| 1757 | hidden_importsym |
| 1758 | { |
| 1759 | $$ = $1; |
Russ Cox | 8f4af6d | 2009-06-06 12:46:38 -0700 | [diff] [blame] | 1760 | structpkg = $$->package; |
Russ Cox | 4efad58 | 2009-01-26 16:57:24 -0800 | [diff] [blame] | 1761 | } |
| 1762 | |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1763 | hidden_import_list: |
| 1764 | | hidden_import_list hidden_import |
Russ Cox | 4efad58 | 2009-01-26 16:57:24 -0800 | [diff] [blame] | 1765 | |
Russ Cox | e52e9ca | 2009-07-17 01:00:44 -0700 | [diff] [blame] | 1766 | hidden_funarg_list: |
| 1767 | hidden_dcl |
| 1768 | { |
| 1769 | $$ = list1($1); |
| 1770 | } |
| 1771 | | hidden_funarg_list ',' hidden_dcl |
| 1772 | { |
| 1773 | $$ = list($1, $3); |
| 1774 | } |
| 1775 | |
| 1776 | hidden_structdcl_list: |
| 1777 | hidden_structdcl |
| 1778 | { |
| 1779 | $$ = list1($1); |
| 1780 | } |
| 1781 | | hidden_structdcl_list ';' hidden_structdcl |
| 1782 | { |
| 1783 | $$ = list($1, $3); |
| 1784 | } |
| 1785 | |
| 1786 | hidden_interfacedcl_list: |
| 1787 | hidden_interfacedcl |
| 1788 | { |
| 1789 | $$ = list1($1); |
| 1790 | } |
| 1791 | | hidden_interfacedcl_list ';' hidden_interfacedcl |
| 1792 | { |
| 1793 | $$ = list($1, $3); |
| 1794 | } |