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