parse.y.go 49 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987
  1. //line build/parse.y:13
  2. package build
  3. import __yyfmt__ "fmt"
  4. //line build/parse.y:13
  5. //line build/parse.y:18
  6. type yySymType struct {
  7. yys int
  8. // input tokens
  9. tok string // raw input syntax
  10. str string // decoding of quoted string
  11. pos Position // position of token
  12. triple bool // was string triple quoted?
  13. // partial syntax trees
  14. expr Expr
  15. exprs []Expr
  16. string *StringExpr
  17. strings []*StringExpr
  18. ifstmt *IfStmt
  19. loadarg *struct {
  20. from Ident
  21. to Ident
  22. }
  23. loadargs []*struct {
  24. from Ident
  25. to Ident
  26. }
  27. // supporting information
  28. comma Position // position of trailing comma in list, if present
  29. lastStmt Expr // most recent rule, to attach line comments to
  30. }
  31. const _AUGM = 57346
  32. const _AND = 57347
  33. const _COMMENT = 57348
  34. const _EOF = 57349
  35. const _EQ = 57350
  36. const _FOR = 57351
  37. const _GE = 57352
  38. const _IDENT = 57353
  39. const _NUMBER = 57354
  40. const _IF = 57355
  41. const _ELSE = 57356
  42. const _ELIF = 57357
  43. const _IN = 57358
  44. const _IS = 57359
  45. const _LAMBDA = 57360
  46. const _LOAD = 57361
  47. const _LE = 57362
  48. const _NE = 57363
  49. const _STAR_STAR = 57364
  50. const _INT_DIV = 57365
  51. const _BIT_LSH = 57366
  52. const _BIT_RSH = 57367
  53. const _NOT = 57368
  54. const _OR = 57369
  55. const _STRING = 57370
  56. const _DEF = 57371
  57. const _RETURN = 57372
  58. const _PASS = 57373
  59. const _BREAK = 57374
  60. const _CONTINUE = 57375
  61. const _INDENT = 57376
  62. const _UNINDENT = 57377
  63. const ShiftInstead = 57378
  64. const _ASSERT = 57379
  65. const _UNARY = 57380
  66. var yyToknames = [...]string{
  67. "$end",
  68. "error",
  69. "$unk",
  70. "'%'",
  71. "'('",
  72. "')'",
  73. "'*'",
  74. "'+'",
  75. "','",
  76. "'-'",
  77. "'.'",
  78. "'/'",
  79. "':'",
  80. "'<'",
  81. "'='",
  82. "'>'",
  83. "'['",
  84. "']'",
  85. "'{'",
  86. "'}'",
  87. "'|'",
  88. "'&'",
  89. "'^'",
  90. "'~'",
  91. "_AUGM",
  92. "_AND",
  93. "_COMMENT",
  94. "_EOF",
  95. "_EQ",
  96. "_FOR",
  97. "_GE",
  98. "_IDENT",
  99. "_NUMBER",
  100. "_IF",
  101. "_ELSE",
  102. "_ELIF",
  103. "_IN",
  104. "_IS",
  105. "_LAMBDA",
  106. "_LOAD",
  107. "_LE",
  108. "_NE",
  109. "_STAR_STAR",
  110. "_INT_DIV",
  111. "_BIT_LSH",
  112. "_BIT_RSH",
  113. "_NOT",
  114. "_OR",
  115. "_STRING",
  116. "_DEF",
  117. "_RETURN",
  118. "_PASS",
  119. "_BREAK",
  120. "_CONTINUE",
  121. "_INDENT",
  122. "_UNINDENT",
  123. "ShiftInstead",
  124. "'\\n'",
  125. "_ASSERT",
  126. "_UNARY",
  127. "';'",
  128. }
  129. var yyStatenames = [...]string{}
  130. const yyEofCode = 1
  131. const yyErrCode = 2
  132. const yyInitialStackSize = 16
  133. //line build/parse.y:977
  134. // Go helper code.
  135. // unary returns a unary expression with the given
  136. // position, operator, and subexpression.
  137. func unary(pos Position, op string, x Expr) Expr {
  138. return &UnaryExpr{
  139. OpStart: pos,
  140. Op: op,
  141. X: x,
  142. }
  143. }
  144. // binary returns a binary expression with the given
  145. // operands, position, and operator.
  146. func binary(x Expr, pos Position, op string, y Expr) Expr {
  147. _, xend := x.Span()
  148. ystart, _ := y.Span()
  149. switch op {
  150. case "=", "+=", "-=", "*=", "/=", "//=", "%=", "|=":
  151. return &AssignExpr{
  152. LHS: x,
  153. OpPos: pos,
  154. Op: op,
  155. LineBreak: xend.Line < ystart.Line,
  156. RHS: y,
  157. }
  158. }
  159. return &BinaryExpr{
  160. X: x,
  161. OpStart: pos,
  162. Op: op,
  163. LineBreak: xend.Line < ystart.Line,
  164. Y: y,
  165. }
  166. }
  167. // isSimpleExpression returns whether an expression is simple and allowed to exist in
  168. // compact forms of sequences.
  169. // The formal criteria are the following: an expression is considered simple if it's
  170. // a literal (variable, string or a number), a literal with a unary operator or an empty sequence.
  171. func isSimpleExpression(expr *Expr) bool {
  172. switch x := (*expr).(type) {
  173. case *LiteralExpr, *StringExpr, *Ident:
  174. return true
  175. case *UnaryExpr:
  176. _, literal := x.X.(*LiteralExpr)
  177. _, ident := x.X.(*Ident)
  178. return literal || ident
  179. case *ListExpr:
  180. return len(x.List) == 0
  181. case *TupleExpr:
  182. return len(x.List) == 0
  183. case *DictExpr:
  184. return len(x.List) == 0
  185. case *SetExpr:
  186. return len(x.List) == 0
  187. default:
  188. return false
  189. }
  190. }
  191. // forceCompact returns the setting for the ForceCompact field for a call or tuple.
  192. //
  193. // NOTE 1: The field is called ForceCompact, not ForceSingleLine,
  194. // because it only affects the formatting associated with the call or tuple syntax,
  195. // not the formatting of the arguments. For example:
  196. //
  197. // call([
  198. // 1,
  199. // 2,
  200. // 3,
  201. // ])
  202. //
  203. // is still a compact call even though it runs on multiple lines.
  204. //
  205. // In contrast the multiline form puts a linebreak after the (.
  206. //
  207. // call(
  208. // [
  209. // 1,
  210. // 2,
  211. // 3,
  212. // ],
  213. // )
  214. //
  215. // NOTE 2: Because of NOTE 1, we cannot use start and end on the
  216. // same line as a signal for compact mode: the formatting of an
  217. // embedded list might move the end to a different line, which would
  218. // then look different on rereading and cause buildifier not to be
  219. // idempotent. Instead, we have to look at properties guaranteed
  220. // to be preserved by the reformatting, namely that the opening
  221. // paren and the first expression are on the same line and that
  222. // each subsequent expression begins on the same line as the last
  223. // one ended (no line breaks after comma).
  224. func forceCompact(start Position, list []Expr, end Position) bool {
  225. if len(list) <= 1 {
  226. // The call or tuple will probably be compact anyway; don't force it.
  227. return false
  228. }
  229. // If there are any named arguments or non-string, non-literal
  230. // arguments, cannot force compact mode.
  231. line := start.Line
  232. for _, x := range list {
  233. start, end := x.Span()
  234. if start.Line != line {
  235. return false
  236. }
  237. line = end.Line
  238. if !isSimpleExpression(&x) {
  239. return false
  240. }
  241. }
  242. return end.Line == line
  243. }
  244. // forceMultiLine returns the setting for the ForceMultiLine field.
  245. func forceMultiLine(start Position, list []Expr, end Position) bool {
  246. if len(list) > 1 {
  247. // The call will be multiline anyway, because it has multiple elements. Don't force it.
  248. return false
  249. }
  250. if len(list) == 0 {
  251. // Empty list: use position of brackets.
  252. return start.Line != end.Line
  253. }
  254. // Single-element list.
  255. // Check whether opening bracket is on different line than beginning of
  256. // element, or closing bracket is on different line than end of element.
  257. elemStart, elemEnd := list[0].Span()
  258. return start.Line != elemStart.Line || end.Line != elemEnd.Line
  259. }
  260. // forceMultiLineComprehension returns the setting for the ForceMultiLine field for a comprehension.
  261. func forceMultiLineComprehension(start Position, expr Expr, clauses []Expr, end Position) bool {
  262. // Return true if there's at least one line break between start, expr, each clause, and end
  263. exprStart, exprEnd := expr.Span()
  264. if start.Line != exprStart.Line {
  265. return true
  266. }
  267. previousEnd := exprEnd
  268. for _, clause := range clauses {
  269. clauseStart, clauseEnd := clause.Span()
  270. if previousEnd.Line != clauseStart.Line {
  271. return true
  272. }
  273. previousEnd = clauseEnd
  274. }
  275. return previousEnd.Line != end.Line
  276. }
  277. // extractTrailingComments extracts trailing comments of an indented block starting with the first
  278. // comment line with indentation less than the block indentation.
  279. // The comments can either belong to CommentBlock statements or to the last non-comment statement
  280. // as After-comments.
  281. func extractTrailingComments(stmt Expr) []Expr {
  282. body := getLastBody(stmt)
  283. var comments []Expr
  284. if body != nil && len(*body) > 0 {
  285. // Get the current indentation level
  286. start, _ := (*body)[0].Span()
  287. indentation := start.LineRune
  288. // Find the last non-comment statement
  289. lastNonCommentIndex := -1
  290. for i, stmt := range *body {
  291. if _, ok := stmt.(*CommentBlock); !ok {
  292. lastNonCommentIndex = i
  293. }
  294. }
  295. if lastNonCommentIndex == -1 {
  296. return comments
  297. }
  298. // Iterate over the trailing comments, find the first comment line that's not indented enough,
  299. // dedent it and all the following comments.
  300. for i := lastNonCommentIndex; i < len(*body); i++ {
  301. stmt := (*body)[i]
  302. if comment := extractDedentedComment(stmt, indentation); comment != nil {
  303. // This comment and all the following CommentBlock statements are to be extracted.
  304. comments = append(comments, comment)
  305. comments = append(comments, (*body)[i+1:]...)
  306. *body = (*body)[:i+1]
  307. // If the current statement is a CommentBlock statement without any comment lines
  308. // it should be removed too.
  309. if i > lastNonCommentIndex && len(stmt.Comment().After) == 0 {
  310. *body = (*body)[:i]
  311. }
  312. }
  313. }
  314. }
  315. return comments
  316. }
  317. // extractDedentedComment extract the first comment line from `stmt` which indentation is smaller
  318. // than `indentation`, and all following comment lines, and returns them in a newly created
  319. // CommentBlock statement.
  320. func extractDedentedComment(stmt Expr, indentation int) Expr {
  321. for i, line := range stmt.Comment().After {
  322. // line.Start.LineRune == 0 can't exist in parsed files, it indicates that the comment line
  323. // has been added by an AST modification. Don't take such lines into account.
  324. if line.Start.LineRune > 0 && line.Start.LineRune < indentation {
  325. // This and all the following lines should be dedented
  326. cb := &CommentBlock{
  327. Start: line.Start,
  328. Comments: Comments{After: stmt.Comment().After[i:]},
  329. }
  330. stmt.Comment().After = stmt.Comment().After[:i]
  331. return cb
  332. }
  333. }
  334. return nil
  335. }
  336. // getLastBody returns the last body of a block statement (the only body for For- and DefStmt
  337. // objects, the last in a if-elif-else chain
  338. func getLastBody(stmt Expr) *[]Expr {
  339. switch block := stmt.(type) {
  340. case *DefStmt:
  341. return &block.Body
  342. case *ForStmt:
  343. return &block.Body
  344. case *IfStmt:
  345. if len(block.False) == 0 {
  346. return &block.True
  347. } else if len(block.False) == 1 {
  348. if next, ok := block.False[0].(*IfStmt); ok {
  349. // Recursively find the last block of the chain
  350. return getLastBody(next)
  351. }
  352. }
  353. return &block.False
  354. }
  355. return nil
  356. }
  357. //line yacctab:1
  358. var yyExca = [...]int{
  359. -1, 1,
  360. 1, -1,
  361. -2, 0,
  362. }
  363. const yyPrivate = 57344
  364. const yyLast = 818
  365. var yyAct = [...]int{
  366. 19, 212, 27, 171, 36, 209, 7, 2, 162, 134,
  367. 143, 147, 89, 41, 9, 97, 21, 169, 146, 222,
  368. 233, 224, 158, 38, 80, 81, 82, 83, 42, 37,
  369. 120, 34, 87, 92, 95, 85, 188, 51, 34, 164,
  370. 50, 54, 131, 55, 40, 52, 103, 221, 37, 149,
  371. 223, 107, 108, 109, 110, 111, 112, 113, 114, 115,
  372. 116, 117, 118, 119, 34, 121, 122, 123, 124, 125,
  373. 126, 127, 128, 129, 192, 165, 135, 53, 136, 33,
  374. 51, 153, 13, 50, 48, 49, 88, 100, 52, 144,
  375. 100, 31, 51, 32, 86, 50, 54, 46, 55, 151,
  376. 52, 163, 154, 73, 105, 79, 34, 35, 152, 66,
  377. 67, 68, 159, 45, 29, 216, 239, 167, 99, 91,
  378. 53, 172, 181, 37, 186, 106, 101, 102, 94, 45,
  379. 104, 191, 53, 69, 70, 43, 149, 226, 179, 180,
  380. 75, 149, 225, 145, 176, 44, 74, 229, 174, 199,
  381. 45, 190, 76, 178, 202, 217, 193, 195, 187, 139,
  382. 182, 45, 141, 189, 187, 168, 42, 200, 201, 194,
  383. 228, 45, 197, 198, 206, 130, 185, 177, 135, 208,
  384. 136, 45, 166, 210, 156, 150, 203, 207, 214, 215,
  385. 213, 142, 235, 196, 175, 157, 98, 84, 96, 205,
  386. 219, 163, 1, 211, 204, 51, 30, 218, 50, 54,
  387. 93, 55, 90, 52, 39, 47, 18, 230, 12, 8,
  388. 220, 4, 227, 67, 183, 184, 28, 210, 148, 232,
  389. 236, 214, 234, 213, 237, 231, 7, 33, 77, 78,
  390. 25, 140, 24, 160, 161, 53, 69, 70, 132, 31,
  391. 133, 32, 0, 0, 0, 0, 26, 0, 0, 6,
  392. 0, 0, 11, 0, 34, 35, 20, 0, 0, 0,
  393. 0, 22, 29, 0, 0, 33, 0, 0, 25, 23,
  394. 24, 37, 10, 14, 15, 16, 17, 31, 238, 32,
  395. 5, 0, 0, 0, 26, 0, 0, 6, 3, 0,
  396. 11, 0, 34, 35, 20, 0, 0, 0, 0, 22,
  397. 29, 0, 0, 33, 0, 0, 25, 23, 24, 37,
  398. 10, 14, 15, 16, 17, 31, 0, 32, 5, 0,
  399. 0, 0, 26, 0, 0, 0, 0, 0, 0, 0,
  400. 34, 35, 0, 0, 0, 0, 0, 22, 29, 0,
  401. 0, 0, 0, 0, 0, 23, 0, 37, 0, 14,
  402. 15, 16, 17, 0, 51, 0, 170, 50, 54, 0,
  403. 55, 0, 52, 155, 56, 0, 57, 0, 0, 0,
  404. 0, 66, 67, 68, 0, 0, 65, 0, 0, 58,
  405. 0, 61, 0, 0, 72, 0, 0, 62, 71, 0,
  406. 0, 59, 60, 0, 53, 69, 70, 63, 64, 51,
  407. 0, 0, 50, 54, 0, 55, 0, 52, 0, 56,
  408. 0, 57, 0, 0, 0, 0, 66, 67, 68, 0,
  409. 0, 65, 0, 0, 58, 0, 61, 0, 0, 72,
  410. 173, 0, 62, 71, 0, 0, 59, 60, 0, 53,
  411. 69, 70, 63, 64, 51, 0, 0, 50, 54, 0,
  412. 55, 0, 52, 0, 56, 0, 57, 0, 0, 0,
  413. 0, 66, 67, 68, 0, 0, 65, 0, 0, 58,
  414. 149, 61, 0, 0, 72, 0, 0, 62, 71, 0,
  415. 0, 59, 60, 0, 53, 69, 70, 63, 64, 51,
  416. 0, 0, 50, 54, 0, 55, 0, 52, 0, 56,
  417. 0, 57, 0, 0, 0, 0, 66, 67, 68, 0,
  418. 0, 65, 0, 0, 58, 0, 61, 0, 0, 72,
  419. 0, 0, 62, 71, 0, 0, 59, 60, 0, 53,
  420. 69, 70, 63, 64, 51, 0, 0, 50, 54, 0,
  421. 55, 0, 52, 0, 56, 0, 57, 0, 0, 0,
  422. 0, 66, 67, 68, 51, 0, 65, 50, 54, 58,
  423. 55, 61, 52, 0, 0, 0, 0, 62, 71, 0,
  424. 0, 59, 60, 0, 53, 69, 70, 63, 64, 33,
  425. 0, 0, 25, 0, 24, 0, 0, 0, 0, 0,
  426. 0, 31, 0, 32, 53, 69, 70, 0, 26, 0,
  427. 0, 0, 0, 0, 0, 0, 34, 35, 0, 0,
  428. 0, 0, 51, 22, 29, 50, 54, 0, 55, 0,
  429. 52, 23, 56, 37, 57, 14, 15, 16, 17, 66,
  430. 67, 68, 0, 0, 65, 0, 0, 58, 0, 61,
  431. 0, 0, 0, 0, 0, 62, 0, 0, 0, 59,
  432. 60, 0, 53, 69, 70, 63, 64, 51, 0, 0,
  433. 50, 54, 0, 55, 0, 52, 0, 56, 0, 57,
  434. 0, 0, 0, 0, 66, 67, 68, 0, 0, 65,
  435. 0, 0, 58, 0, 61, 0, 0, 0, 0, 0,
  436. 62, 0, 0, 0, 59, 60, 0, 53, 69, 70,
  437. 63, 51, 0, 0, 50, 54, 0, 55, 0, 52,
  438. 0, 56, 0, 57, 0, 0, 0, 0, 66, 67,
  439. 68, 0, 0, 0, 0, 0, 58, 0, 61, 0,
  440. 0, 0, 0, 0, 62, 0, 0, 0, 59, 60,
  441. 0, 53, 69, 70, 63, 33, 0, 137, 25, 0,
  442. 24, 0, 51, 0, 0, 50, 54, 31, 55, 32,
  443. 52, 0, 0, 33, 26, 0, 25, 0, 24, 0,
  444. 67, 68, 34, 35, 0, 31, 0, 32, 0, 22,
  445. 29, 0, 26, 138, 0, 0, 0, 23, 0, 37,
  446. 34, 35, 53, 69, 70, 0, 0, 22, 29, 0,
  447. 0, 0, 0, 0, 0, 23, 0, 37,
  448. }
  449. var yyPact = [...]int{
  450. -1000, -1000, 270, -1000, -1000, -1000, -35, -1000, -1000, -1000,
  451. 12, 74, -1000, 120, 768, -1000, -1000, -1000, 49, 495,
  452. 768, 135, 768, 768, 768, 768, 768, -1000, -1000, 192,
  453. -20, 768, 768, 768, -1000, -1000, -1000, -1000, -1000, -46,
  454. 191, 81, 135, 768, 768, 768, 172, 768, 91, -1000,
  455. 768, 768, 768, 768, 768, 768, 768, 768, 768, 768,
  456. 768, 768, 768, -7, 768, 768, 768, 768, 768, 768,
  457. 768, 768, 768, 162, 10, 750, 768, 149, 182, 172,
  458. -1000, -1000, -1000, -1000, -20, -1000, 125, 450, 176, 19,
  459. 61, 176, 360, 175, 189, 495, -36, 584, 32, 768,
  460. 74, 172, 172, 540, 152, 308, -1000, -1000, -1000, -1000,
  461. -1000, 76, 76, 88, 88, 88, 88, 88, 88, 88,
  462. 768, 663, 707, 758, 560, 201, 33, 33, 618, 405,
  463. 308, -1000, 188, 168, -1000, 495, 138, 768, 768, 104,
  464. 147, 768, 768, -1000, 167, -1000, 106, 2, -1000, 74,
  465. 768, -1000, 111, -1000, 54, 768, 768, -1000, -1000, -1000,
  466. 187, 164, -1000, 134, 6, 6, 141, 135, 308, -1000,
  467. -1000, -1000, 88, 768, -1000, -1000, -1000, 750, 768, 495,
  468. 495, -1000, 768, -1000, -1000, -1, -1000, 2, 768, 78,
  469. 495, -1000, -1000, 495, -1000, 360, 142, -1000, 32, 768,
  470. -1000, -1000, 308, -1000, -8, -37, 540, -1000, 495, 124,
  471. 495, 161, -1000, -1000, 132, 540, 768, 308, -1000, 495,
  472. -1000, -1000, -38, -1000, -1000, -1000, 768, 186, -1, -20,
  473. 540, -1000, 232, -1000, 98, -1000, -1000, -1000, -1000, -1000,
  474. }
  475. var yyPgo = [...]int{
  476. 0, 10, 9, 250, 248, 8, 244, 243, 0, 5,
  477. 94, 16, 82, 241, 86, 239, 238, 13, 228, 11,
  478. 18, 2, 226, 7, 221, 219, 218, 216, 215, 3,
  479. 14, 214, 12, 212, 210, 4, 206, 17, 204, 1,
  480. 203, 202, 199, 198,
  481. }
  482. var yyR1 = [...]int{
  483. 0, 41, 37, 37, 42, 42, 38, 38, 38, 23,
  484. 23, 23, 23, 24, 24, 25, 25, 25, 27, 27,
  485. 26, 26, 28, 28, 29, 31, 31, 30, 30, 30,
  486. 30, 30, 30, 30, 30, 43, 43, 11, 11, 11,
  487. 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
  488. 11, 11, 4, 4, 3, 3, 2, 2, 2, 2,
  489. 40, 40, 39, 39, 7, 7, 6, 6, 5, 5,
  490. 5, 5, 5, 12, 12, 13, 13, 15, 15, 16,
  491. 16, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  492. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  493. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  494. 14, 14, 9, 9, 10, 10, 1, 1, 32, 34,
  495. 34, 33, 33, 33, 17, 17, 35, 36, 36, 21,
  496. 22, 18, 19, 19, 20, 20,
  497. }
  498. var yyR2 = [...]int{
  499. 0, 2, 5, 2, 0, 2, 0, 3, 2, 0,
  500. 2, 2, 3, 1, 1, 7, 6, 1, 4, 5,
  501. 1, 4, 2, 1, 4, 0, 3, 1, 2, 1,
  502. 3, 3, 1, 1, 1, 0, 1, 1, 1, 3,
  503. 7, 4, 4, 6, 8, 1, 3, 4, 4, 3,
  504. 4, 3, 0, 2, 1, 3, 1, 3, 2, 2,
  505. 1, 3, 1, 3, 0, 2, 1, 3, 1, 3,
  506. 2, 1, 2, 1, 3, 0, 1, 1, 3, 0,
  507. 2, 1, 4, 2, 2, 2, 2, 3, 3, 3,
  508. 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
  509. 4, 3, 3, 3, 3, 3, 3, 3, 3, 5,
  510. 1, 3, 0, 1, 0, 2, 0, 1, 3, 1,
  511. 3, 0, 1, 2, 1, 3, 1, 1, 2, 1,
  512. 1, 4, 1, 3, 1, 2,
  513. }
  514. var yyChk = [...]int{
  515. -1000, -41, -23, 28, -24, 58, 27, -29, -25, -30,
  516. 50, 30, -26, -12, 51, 52, 53, 54, -27, -8,
  517. 34, -11, 39, 47, 10, 8, 24, -21, -22, 40,
  518. -36, 17, 19, 5, 32, 33, -35, 49, 58, -31,
  519. 32, -17, -11, 15, 25, 9, -12, -28, 35, 36,
  520. 7, 4, 12, 44, 8, 10, 14, 16, 29, 41,
  521. 42, 31, 37, 47, 48, 26, 21, 22, 23, 45,
  522. 46, 38, 34, -12, 11, 5, 17, -16, -15, -12,
  523. -8, -8, -8, -8, 5, -35, -10, -8, -14, -32,
  524. -33, -14, -8, -34, -10, -8, -43, 61, 5, 37,
  525. 9, -12, -12, -8, -12, 13, 34, -8, -8, -8,
  526. -8, -8, -8, -8, -8, -8, -8, -8, -8, -8,
  527. 37, -8, -8, -8, -8, -8, -8, -8, -8, -8,
  528. 13, 32, -4, -3, -2, -8, -21, 7, 43, -12,
  529. -13, 13, 9, -1, -35, 18, -20, -19, -18, 30,
  530. 9, -1, -20, 20, -1, 13, 9, 6, 58, -30,
  531. -7, -6, -5, -21, 7, 43, -12, -11, 13, -37,
  532. 58, -29, -8, 35, -37, 6, -1, 9, 15, -8,
  533. -8, 18, 13, -12, -12, 9, 18, -19, 34, -17,
  534. -8, 20, 20, -8, -32, -8, 6, -1, 9, 15,
  535. -21, -21, 13, -37, -38, -42, -8, -2, -8, -9,
  536. -8, -40, -39, -35, -21, -8, 37, 13, -5, -8,
  537. -37, 55, 27, 58, 58, 18, 13, -1, 9, 15,
  538. -8, -37, -23, 58, -9, 6, -39, -35, 56, 18,
  539. }
  540. var yyDef = [...]int{
  541. 9, -2, 0, 1, 10, 11, 0, 13, 14, 25,
  542. 0, 0, 17, 27, 29, 32, 33, 34, 20, 73,
  543. 0, 81, 79, 0, 0, 0, 0, 37, 38, 0,
  544. 45, 114, 121, 114, 129, 130, 127, 126, 12, 35,
  545. 0, 0, 124, 0, 0, 0, 28, 0, 0, 23,
  546. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  547. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  548. 0, 0, 0, 0, 0, 52, 75, 0, 116, 77,
  549. 83, 84, 85, 86, 0, 128, 0, 110, 116, 119,
  550. 0, 116, 110, 122, 0, 110, 0, 36, 64, 0,
  551. 0, 30, 31, 74, 0, 0, 22, 87, 88, 89,
  552. 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,
  553. 0, 101, 102, 103, 104, 105, 106, 107, 108, 0,
  554. 0, 39, 0, 116, 54, 56, 37, 0, 0, 76,
  555. 0, 0, 117, 80, 0, 46, 0, 134, 132, 0,
  556. 117, 115, 0, 49, 0, 0, 123, 51, 24, 26,
  557. 0, 116, 66, 68, 71, 0, 0, 125, 0, 21,
  558. 6, 4, 100, 0, 18, 41, 53, 117, 0, 58,
  559. 59, 42, 112, 82, 78, 0, 47, 135, 0, 0,
  560. 111, 48, 50, 118, 120, 0, 0, 65, 117, 0,
  561. 70, 72, 0, 19, 0, 3, 109, 55, 57, 0,
  562. 113, 116, 60, 62, 0, 133, 0, 0, 67, 69,
  563. 16, 9, 0, 8, 5, 43, 112, 0, 117, 0,
  564. 131, 15, 0, 7, 0, 40, 61, 63, 2, 44,
  565. }
  566. var yyTok1 = [...]int{
  567. 1, 3, 3, 3, 3, 3, 3, 3, 3, 3,
  568. 58, 3, 3, 3, 3, 3, 3, 3, 3, 3,
  569. 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
  570. 3, 3, 3, 3, 3, 3, 3, 4, 22, 3,
  571. 5, 6, 7, 8, 9, 10, 11, 12, 3, 3,
  572. 3, 3, 3, 3, 3, 3, 3, 3, 13, 61,
  573. 14, 15, 16, 3, 3, 3, 3, 3, 3, 3,
  574. 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
  575. 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
  576. 3, 17, 3, 18, 23, 3, 3, 3, 3, 3,
  577. 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
  578. 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
  579. 3, 3, 3, 19, 21, 20, 24,
  580. }
  581. var yyTok2 = [...]int{
  582. 2, 3, 25, 26, 27, 28, 29, 30, 31, 32,
  583. 33, 34, 35, 36, 37, 38, 39, 40, 41, 42,
  584. 43, 44, 45, 46, 47, 48, 49, 50, 51, 52,
  585. 53, 54, 55, 56, 57, 59, 60,
  586. }
  587. var yyTok3 = [...]int{
  588. 0,
  589. }
  590. var yyErrorMessages = [...]struct {
  591. state int
  592. token int
  593. msg string
  594. }{}
  595. //line yaccpar:1
  596. /* parser for yacc output */
  597. var (
  598. yyDebug = 0
  599. yyErrorVerbose = false
  600. )
  601. type yyLexer interface {
  602. Lex(lval *yySymType) int
  603. Error(s string)
  604. }
  605. type yyParser interface {
  606. Parse(yyLexer) int
  607. Lookahead() int
  608. }
  609. type yyParserImpl struct {
  610. lval yySymType
  611. stack [yyInitialStackSize]yySymType
  612. char int
  613. }
  614. func (p *yyParserImpl) Lookahead() int {
  615. return p.char
  616. }
  617. func yyNewParser() yyParser {
  618. return &yyParserImpl{}
  619. }
  620. const yyFlag = -1000
  621. func yyTokname(c int) string {
  622. if c >= 1 && c-1 < len(yyToknames) {
  623. if yyToknames[c-1] != "" {
  624. return yyToknames[c-1]
  625. }
  626. }
  627. return __yyfmt__.Sprintf("tok-%v", c)
  628. }
  629. func yyStatname(s int) string {
  630. if s >= 0 && s < len(yyStatenames) {
  631. if yyStatenames[s] != "" {
  632. return yyStatenames[s]
  633. }
  634. }
  635. return __yyfmt__.Sprintf("state-%v", s)
  636. }
  637. func yyErrorMessage(state, lookAhead int) string {
  638. const TOKSTART = 4
  639. if !yyErrorVerbose {
  640. return "syntax error"
  641. }
  642. for _, e := range yyErrorMessages {
  643. if e.state == state && e.token == lookAhead {
  644. return "syntax error: " + e.msg
  645. }
  646. }
  647. res := "syntax error: unexpected " + yyTokname(lookAhead)
  648. // To match Bison, suggest at most four expected tokens.
  649. expected := make([]int, 0, 4)
  650. // Look for shiftable tokens.
  651. base := yyPact[state]
  652. for tok := TOKSTART; tok-1 < len(yyToknames); tok++ {
  653. if n := base + tok; n >= 0 && n < yyLast && yyChk[yyAct[n]] == tok {
  654. if len(expected) == cap(expected) {
  655. return res
  656. }
  657. expected = append(expected, tok)
  658. }
  659. }
  660. if yyDef[state] == -2 {
  661. i := 0
  662. for yyExca[i] != -1 || yyExca[i+1] != state {
  663. i += 2
  664. }
  665. // Look for tokens that we accept or reduce.
  666. for i += 2; yyExca[i] >= 0; i += 2 {
  667. tok := yyExca[i]
  668. if tok < TOKSTART || yyExca[i+1] == 0 {
  669. continue
  670. }
  671. if len(expected) == cap(expected) {
  672. return res
  673. }
  674. expected = append(expected, tok)
  675. }
  676. // If the default action is to accept or reduce, give up.
  677. if yyExca[i+1] != 0 {
  678. return res
  679. }
  680. }
  681. for i, tok := range expected {
  682. if i == 0 {
  683. res += ", expecting "
  684. } else {
  685. res += " or "
  686. }
  687. res += yyTokname(tok)
  688. }
  689. return res
  690. }
  691. func yylex1(lex yyLexer, lval *yySymType) (char, token int) {
  692. token = 0
  693. char = lex.Lex(lval)
  694. if char <= 0 {
  695. token = yyTok1[0]
  696. goto out
  697. }
  698. if char < len(yyTok1) {
  699. token = yyTok1[char]
  700. goto out
  701. }
  702. if char >= yyPrivate {
  703. if char < yyPrivate+len(yyTok2) {
  704. token = yyTok2[char-yyPrivate]
  705. goto out
  706. }
  707. }
  708. for i := 0; i < len(yyTok3); i += 2 {
  709. token = yyTok3[i+0]
  710. if token == char {
  711. token = yyTok3[i+1]
  712. goto out
  713. }
  714. }
  715. out:
  716. if token == 0 {
  717. token = yyTok2[1] /* unknown char */
  718. }
  719. if yyDebug >= 3 {
  720. __yyfmt__.Printf("lex %s(%d)\n", yyTokname(token), uint(char))
  721. }
  722. return char, token
  723. }
  724. func yyParse(yylex yyLexer) int {
  725. return yyNewParser().Parse(yylex)
  726. }
  727. func (yyrcvr *yyParserImpl) Parse(yylex yyLexer) int {
  728. var yyn int
  729. var yyVAL yySymType
  730. var yyDollar []yySymType
  731. _ = yyDollar // silence set and not used
  732. yyS := yyrcvr.stack[:]
  733. Nerrs := 0 /* number of errors */
  734. Errflag := 0 /* error recovery flag */
  735. yystate := 0
  736. yyrcvr.char = -1
  737. yytoken := -1 // yyrcvr.char translated into internal numbering
  738. defer func() {
  739. // Make sure we report no lookahead when not parsing.
  740. yystate = -1
  741. yyrcvr.char = -1
  742. yytoken = -1
  743. }()
  744. yyp := -1
  745. goto yystack
  746. ret0:
  747. return 0
  748. ret1:
  749. return 1
  750. yystack:
  751. /* put a state and value onto the stack */
  752. if yyDebug >= 4 {
  753. __yyfmt__.Printf("char %v in %v\n", yyTokname(yytoken), yyStatname(yystate))
  754. }
  755. yyp++
  756. if yyp >= len(yyS) {
  757. nyys := make([]yySymType, len(yyS)*2)
  758. copy(nyys, yyS)
  759. yyS = nyys
  760. }
  761. yyS[yyp] = yyVAL
  762. yyS[yyp].yys = yystate
  763. yynewstate:
  764. yyn = yyPact[yystate]
  765. if yyn <= yyFlag {
  766. goto yydefault /* simple state */
  767. }
  768. if yyrcvr.char < 0 {
  769. yyrcvr.char, yytoken = yylex1(yylex, &yyrcvr.lval)
  770. }
  771. yyn += yytoken
  772. if yyn < 0 || yyn >= yyLast {
  773. goto yydefault
  774. }
  775. yyn = yyAct[yyn]
  776. if yyChk[yyn] == yytoken { /* valid shift */
  777. yyrcvr.char = -1
  778. yytoken = -1
  779. yyVAL = yyrcvr.lval
  780. yystate = yyn
  781. if Errflag > 0 {
  782. Errflag--
  783. }
  784. goto yystack
  785. }
  786. yydefault:
  787. /* default state action */
  788. yyn = yyDef[yystate]
  789. if yyn == -2 {
  790. if yyrcvr.char < 0 {
  791. yyrcvr.char, yytoken = yylex1(yylex, &yyrcvr.lval)
  792. }
  793. /* look through exception table */
  794. xi := 0
  795. for {
  796. if yyExca[xi+0] == -1 && yyExca[xi+1] == yystate {
  797. break
  798. }
  799. xi += 2
  800. }
  801. for xi += 2; ; xi += 2 {
  802. yyn = yyExca[xi+0]
  803. if yyn < 0 || yyn == yytoken {
  804. break
  805. }
  806. }
  807. yyn = yyExca[xi+1]
  808. if yyn < 0 {
  809. goto ret0
  810. }
  811. }
  812. if yyn == 0 {
  813. /* error ... attempt to resume parsing */
  814. switch Errflag {
  815. case 0: /* brand new error */
  816. yylex.Error(yyErrorMessage(yystate, yytoken))
  817. Nerrs++
  818. if yyDebug >= 1 {
  819. __yyfmt__.Printf("%s", yyStatname(yystate))
  820. __yyfmt__.Printf(" saw %s\n", yyTokname(yytoken))
  821. }
  822. fallthrough
  823. case 1, 2: /* incompletely recovered error ... try again */
  824. Errflag = 3
  825. /* find a state where "error" is a legal shift action */
  826. for yyp >= 0 {
  827. yyn = yyPact[yyS[yyp].yys] + yyErrCode
  828. if yyn >= 0 && yyn < yyLast {
  829. yystate = yyAct[yyn] /* simulate a shift of "error" */
  830. if yyChk[yystate] == yyErrCode {
  831. goto yystack
  832. }
  833. }
  834. /* the current p has no shift on "error", pop stack */
  835. if yyDebug >= 2 {
  836. __yyfmt__.Printf("error recovery pops state %d\n", yyS[yyp].yys)
  837. }
  838. yyp--
  839. }
  840. /* there is no state on the stack with an error shift ... abort */
  841. goto ret1
  842. case 3: /* no shift yet; clobber input char */
  843. if yyDebug >= 2 {
  844. __yyfmt__.Printf("error recovery discards %s\n", yyTokname(yytoken))
  845. }
  846. if yytoken == yyEofCode {
  847. goto ret1
  848. }
  849. yyrcvr.char = -1
  850. yytoken = -1
  851. goto yynewstate /* try again in the same state */
  852. }
  853. }
  854. /* reduction by production yyn */
  855. if yyDebug >= 2 {
  856. __yyfmt__.Printf("reduce %v in:\n\t%v\n", yyn, yyStatname(yystate))
  857. }
  858. yynt := yyn
  859. yypt := yyp
  860. _ = yypt // guard against "declared and not used"
  861. yyp -= yyR2[yyn]
  862. // yyp is now the index of $0. Perform the default action. Iff the
  863. // reduced production is ε, $1 is possibly out of range.
  864. if yyp+1 >= len(yyS) {
  865. nyys := make([]yySymType, len(yyS)*2)
  866. copy(nyys, yyS)
  867. yyS = nyys
  868. }
  869. yyVAL = yyS[yyp+1]
  870. /* consult goto table to find next state */
  871. yyn = yyR1[yyn]
  872. yyg := yyPgo[yyn]
  873. yyj := yyg + yyS[yyp].yys + 1
  874. if yyj >= yyLast {
  875. yystate = yyAct[yyg]
  876. } else {
  877. yystate = yyAct[yyj]
  878. if yyChk[yystate] != -yyn {
  879. yystate = yyAct[yyg]
  880. }
  881. }
  882. // dummy call; replaced with literal code
  883. switch yynt {
  884. case 1:
  885. yyDollar = yyS[yypt-2 : yypt+1]
  886. //line build/parse.y:195
  887. {
  888. yylex.(*input).file = &File{Stmt: yyDollar[1].exprs}
  889. return 0
  890. }
  891. case 2:
  892. yyDollar = yyS[yypt-5 : yypt+1]
  893. //line build/parse.y:202
  894. {
  895. statements := yyDollar[4].exprs
  896. if yyDollar[2].exprs != nil {
  897. // $2 can only contain *CommentBlock objects, each of them contains a non-empty After slice
  898. cb := yyDollar[2].exprs[len(yyDollar[2].exprs)-1].(*CommentBlock)
  899. // $4 can't be empty and can't start with a comment
  900. stmt := yyDollar[4].exprs[0]
  901. start, _ := stmt.Span()
  902. if start.Line-cb.After[len(cb.After)-1].Start.Line == 1 {
  903. // The first statement of $4 starts on the next line after the last comment of $2.
  904. // Attach the last comment to the first statement
  905. stmt.Comment().Before = cb.After
  906. yyDollar[2].exprs = yyDollar[2].exprs[:len(yyDollar[2].exprs)-1]
  907. }
  908. statements = append(yyDollar[2].exprs, yyDollar[4].exprs...)
  909. }
  910. yyVAL.exprs = statements
  911. yyVAL.lastStmt = yyDollar[4].lastStmt
  912. }
  913. case 3:
  914. yyDollar = yyS[yypt-2 : yypt+1]
  915. //line build/parse.y:222
  916. {
  917. yyVAL.exprs = yyDollar[1].exprs
  918. }
  919. case 6:
  920. yyDollar = yyS[yypt-0 : yypt+1]
  921. //line build/parse.y:230
  922. {
  923. yyVAL.exprs = nil
  924. yyVAL.lastStmt = nil
  925. }
  926. case 7:
  927. yyDollar = yyS[yypt-3 : yypt+1]
  928. //line build/parse.y:235
  929. {
  930. yyVAL.exprs = yyDollar[1].exprs
  931. yyVAL.lastStmt = yyDollar[1].lastStmt
  932. if yyVAL.lastStmt == nil {
  933. cb := &CommentBlock{Start: yyDollar[2].pos}
  934. yyVAL.exprs = append(yyVAL.exprs, cb)
  935. yyVAL.lastStmt = cb
  936. }
  937. com := yyVAL.lastStmt.Comment()
  938. com.After = append(com.After, Comment{Start: yyDollar[2].pos, Token: yyDollar[2].tok})
  939. }
  940. case 8:
  941. yyDollar = yyS[yypt-2 : yypt+1]
  942. //line build/parse.y:247
  943. {
  944. yyVAL.exprs = yyDollar[1].exprs
  945. yyVAL.lastStmt = nil
  946. }
  947. case 9:
  948. yyDollar = yyS[yypt-0 : yypt+1]
  949. //line build/parse.y:253
  950. {
  951. yyVAL.exprs = nil
  952. yyVAL.lastStmt = nil
  953. }
  954. case 10:
  955. yyDollar = yyS[yypt-2 : yypt+1]
  956. //line build/parse.y:258
  957. {
  958. // If this statement follows a comment block,
  959. // attach the comments to the statement.
  960. if cb, ok := yyDollar[1].lastStmt.(*CommentBlock); ok {
  961. yyVAL.exprs = append(yyDollar[1].exprs[:len(yyDollar[1].exprs)-1], yyDollar[2].exprs...)
  962. yyDollar[2].exprs[0].Comment().Before = cb.After
  963. yyVAL.lastStmt = yyDollar[2].lastStmt
  964. break
  965. }
  966. // Otherwise add to list.
  967. yyVAL.exprs = append(yyDollar[1].exprs, yyDollar[2].exprs...)
  968. yyVAL.lastStmt = yyDollar[2].lastStmt
  969. // Consider this input:
  970. //
  971. // foo()
  972. // # bar
  973. // baz()
  974. //
  975. // If we've just parsed baz(), the # bar is attached to
  976. // foo() as an After comment. Make it a Before comment
  977. // for baz() instead.
  978. if x := yyDollar[1].lastStmt; x != nil {
  979. com := x.Comment()
  980. // stmt is never empty
  981. yyDollar[2].exprs[0].Comment().Before = com.After
  982. com.After = nil
  983. }
  984. }
  985. case 11:
  986. yyDollar = yyS[yypt-2 : yypt+1]
  987. //line build/parse.y:289
  988. {
  989. // Blank line; sever last rule from future comments.
  990. yyVAL.exprs = yyDollar[1].exprs
  991. yyVAL.lastStmt = nil
  992. }
  993. case 12:
  994. yyDollar = yyS[yypt-3 : yypt+1]
  995. //line build/parse.y:295
  996. {
  997. yyVAL.exprs = yyDollar[1].exprs
  998. yyVAL.lastStmt = yyDollar[1].lastStmt
  999. if yyVAL.lastStmt == nil {
  1000. cb := &CommentBlock{Start: yyDollar[2].pos}
  1001. yyVAL.exprs = append(yyVAL.exprs, cb)
  1002. yyVAL.lastStmt = cb
  1003. }
  1004. com := yyVAL.lastStmt.Comment()
  1005. com.After = append(com.After, Comment{Start: yyDollar[2].pos, Token: yyDollar[2].tok})
  1006. }
  1007. case 13:
  1008. yyDollar = yyS[yypt-1 : yypt+1]
  1009. //line build/parse.y:309
  1010. {
  1011. yyVAL.exprs = yyDollar[1].exprs
  1012. yyVAL.lastStmt = yyDollar[1].exprs[len(yyDollar[1].exprs)-1]
  1013. }
  1014. case 14:
  1015. yyDollar = yyS[yypt-1 : yypt+1]
  1016. //line build/parse.y:314
  1017. {
  1018. yyVAL.exprs = []Expr{yyDollar[1].expr}
  1019. yyVAL.lastStmt = yyDollar[1].expr
  1020. if cbs := extractTrailingComments(yyDollar[1].expr); len(cbs) > 0 {
  1021. yyVAL.exprs = append(yyVAL.exprs, cbs...)
  1022. yyVAL.lastStmt = cbs[len(cbs)-1]
  1023. if yyDollar[1].lastStmt == nil {
  1024. yyVAL.lastStmt = nil
  1025. }
  1026. }
  1027. }
  1028. case 15:
  1029. yyDollar = yyS[yypt-7 : yypt+1]
  1030. //line build/parse.y:328
  1031. {
  1032. yyVAL.expr = &DefStmt{
  1033. Function: Function{
  1034. StartPos: yyDollar[1].pos,
  1035. Params: yyDollar[4].exprs,
  1036. Body: yyDollar[7].exprs,
  1037. },
  1038. Name: yyDollar[2].tok,
  1039. ColonPos: yyDollar[6].pos,
  1040. ForceCompact: forceCompact(yyDollar[3].pos, yyDollar[4].exprs, yyDollar[5].pos),
  1041. ForceMultiLine: forceMultiLine(yyDollar[3].pos, yyDollar[4].exprs, yyDollar[5].pos),
  1042. }
  1043. yyVAL.lastStmt = yyDollar[7].lastStmt
  1044. }
  1045. case 16:
  1046. yyDollar = yyS[yypt-6 : yypt+1]
  1047. //line build/parse.y:343
  1048. {
  1049. yyVAL.expr = &ForStmt{
  1050. For: yyDollar[1].pos,
  1051. Vars: yyDollar[2].expr,
  1052. X: yyDollar[4].expr,
  1053. Body: yyDollar[6].exprs,
  1054. }
  1055. yyVAL.lastStmt = yyDollar[6].lastStmt
  1056. }
  1057. case 17:
  1058. yyDollar = yyS[yypt-1 : yypt+1]
  1059. //line build/parse.y:353
  1060. {
  1061. yyVAL.expr = yyDollar[1].ifstmt
  1062. yyVAL.lastStmt = yyDollar[1].lastStmt
  1063. }
  1064. case 18:
  1065. yyDollar = yyS[yypt-4 : yypt+1]
  1066. //line build/parse.y:361
  1067. {
  1068. yyVAL.ifstmt = &IfStmt{
  1069. If: yyDollar[1].pos,
  1070. Cond: yyDollar[2].expr,
  1071. True: yyDollar[4].exprs,
  1072. }
  1073. yyVAL.lastStmt = yyDollar[4].lastStmt
  1074. }
  1075. case 19:
  1076. yyDollar = yyS[yypt-5 : yypt+1]
  1077. //line build/parse.y:370
  1078. {
  1079. yyVAL.ifstmt = yyDollar[1].ifstmt
  1080. inner := yyDollar[1].ifstmt
  1081. for len(inner.False) == 1 {
  1082. inner = inner.False[0].(*IfStmt)
  1083. }
  1084. inner.ElsePos = End{Pos: yyDollar[2].pos}
  1085. inner.False = []Expr{
  1086. &IfStmt{
  1087. If: yyDollar[2].pos,
  1088. Cond: yyDollar[3].expr,
  1089. True: yyDollar[5].exprs,
  1090. },
  1091. }
  1092. yyVAL.lastStmt = yyDollar[5].lastStmt
  1093. }
  1094. case 21:
  1095. yyDollar = yyS[yypt-4 : yypt+1]
  1096. //line build/parse.y:391
  1097. {
  1098. yyVAL.ifstmt = yyDollar[1].ifstmt
  1099. inner := yyDollar[1].ifstmt
  1100. for len(inner.False) == 1 {
  1101. inner = inner.False[0].(*IfStmt)
  1102. }
  1103. inner.ElsePos = End{Pos: yyDollar[2].pos}
  1104. inner.False = yyDollar[4].exprs
  1105. yyVAL.lastStmt = yyDollar[4].lastStmt
  1106. }
  1107. case 24:
  1108. yyDollar = yyS[yypt-4 : yypt+1]
  1109. //line build/parse.y:408
  1110. {
  1111. yyVAL.exprs = append([]Expr{yyDollar[1].expr}, yyDollar[2].exprs...)
  1112. yyVAL.lastStmt = yyVAL.exprs[len(yyVAL.exprs)-1]
  1113. }
  1114. case 25:
  1115. yyDollar = yyS[yypt-0 : yypt+1]
  1116. //line build/parse.y:414
  1117. {
  1118. yyVAL.exprs = []Expr{}
  1119. }
  1120. case 26:
  1121. yyDollar = yyS[yypt-3 : yypt+1]
  1122. //line build/parse.y:418
  1123. {
  1124. yyVAL.exprs = append(yyDollar[1].exprs, yyDollar[3].expr)
  1125. }
  1126. case 28:
  1127. yyDollar = yyS[yypt-2 : yypt+1]
  1128. //line build/parse.y:425
  1129. {
  1130. yyVAL.expr = &ReturnStmt{
  1131. Return: yyDollar[1].pos,
  1132. Result: yyDollar[2].expr,
  1133. }
  1134. }
  1135. case 29:
  1136. yyDollar = yyS[yypt-1 : yypt+1]
  1137. //line build/parse.y:432
  1138. {
  1139. yyVAL.expr = &ReturnStmt{
  1140. Return: yyDollar[1].pos,
  1141. }
  1142. }
  1143. case 30:
  1144. yyDollar = yyS[yypt-3 : yypt+1]
  1145. //line build/parse.y:437
  1146. {
  1147. yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
  1148. }
  1149. case 31:
  1150. yyDollar = yyS[yypt-3 : yypt+1]
  1151. //line build/parse.y:438
  1152. {
  1153. yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
  1154. }
  1155. case 32:
  1156. yyDollar = yyS[yypt-1 : yypt+1]
  1157. //line build/parse.y:440
  1158. {
  1159. yyVAL.expr = &BranchStmt{
  1160. Token: yyDollar[1].tok,
  1161. TokenPos: yyDollar[1].pos,
  1162. }
  1163. }
  1164. case 33:
  1165. yyDollar = yyS[yypt-1 : yypt+1]
  1166. //line build/parse.y:447
  1167. {
  1168. yyVAL.expr = &BranchStmt{
  1169. Token: yyDollar[1].tok,
  1170. TokenPos: yyDollar[1].pos,
  1171. }
  1172. }
  1173. case 34:
  1174. yyDollar = yyS[yypt-1 : yypt+1]
  1175. //line build/parse.y:454
  1176. {
  1177. yyVAL.expr = &BranchStmt{
  1178. Token: yyDollar[1].tok,
  1179. TokenPos: yyDollar[1].pos,
  1180. }
  1181. }
  1182. case 39:
  1183. yyDollar = yyS[yypt-3 : yypt+1]
  1184. //line build/parse.y:468
  1185. {
  1186. yyVAL.expr = &DotExpr{
  1187. X: yyDollar[1].expr,
  1188. Dot: yyDollar[2].pos,
  1189. NamePos: yyDollar[3].pos,
  1190. Name: yyDollar[3].tok,
  1191. }
  1192. }
  1193. case 40:
  1194. yyDollar = yyS[yypt-7 : yypt+1]
  1195. //line build/parse.y:477
  1196. {
  1197. load := &LoadStmt{
  1198. Load: yyDollar[1].pos,
  1199. Module: yyDollar[3].string,
  1200. Rparen: End{Pos: yyDollar[7].pos},
  1201. ForceCompact: yyDollar[1].pos.Line == yyDollar[7].pos.Line,
  1202. }
  1203. for _, arg := range yyDollar[5].loadargs {
  1204. load.From = append(load.From, &arg.from)
  1205. load.To = append(load.To, &arg.to)
  1206. }
  1207. yyVAL.expr = load
  1208. }
  1209. case 41:
  1210. yyDollar = yyS[yypt-4 : yypt+1]
  1211. //line build/parse.y:491
  1212. {
  1213. yyVAL.expr = &CallExpr{
  1214. X: yyDollar[1].expr,
  1215. ListStart: yyDollar[2].pos,
  1216. List: yyDollar[3].exprs,
  1217. End: End{Pos: yyDollar[4].pos},
  1218. ForceCompact: forceCompact(yyDollar[2].pos, yyDollar[3].exprs, yyDollar[4].pos),
  1219. ForceMultiLine: forceMultiLine(yyDollar[2].pos, yyDollar[3].exprs, yyDollar[4].pos),
  1220. }
  1221. }
  1222. case 42:
  1223. yyDollar = yyS[yypt-4 : yypt+1]
  1224. //line build/parse.y:502
  1225. {
  1226. yyVAL.expr = &IndexExpr{
  1227. X: yyDollar[1].expr,
  1228. IndexStart: yyDollar[2].pos,
  1229. Y: yyDollar[3].expr,
  1230. End: yyDollar[4].pos,
  1231. }
  1232. }
  1233. case 43:
  1234. yyDollar = yyS[yypt-6 : yypt+1]
  1235. //line build/parse.y:511
  1236. {
  1237. yyVAL.expr = &SliceExpr{
  1238. X: yyDollar[1].expr,
  1239. SliceStart: yyDollar[2].pos,
  1240. From: yyDollar[3].expr,
  1241. FirstColon: yyDollar[4].pos,
  1242. To: yyDollar[5].expr,
  1243. End: yyDollar[6].pos,
  1244. }
  1245. }
  1246. case 44:
  1247. yyDollar = yyS[yypt-8 : yypt+1]
  1248. //line build/parse.y:522
  1249. {
  1250. yyVAL.expr = &SliceExpr{
  1251. X: yyDollar[1].expr,
  1252. SliceStart: yyDollar[2].pos,
  1253. From: yyDollar[3].expr,
  1254. FirstColon: yyDollar[4].pos,
  1255. To: yyDollar[5].expr,
  1256. SecondColon: yyDollar[6].pos,
  1257. Step: yyDollar[7].expr,
  1258. End: yyDollar[8].pos,
  1259. }
  1260. }
  1261. case 45:
  1262. yyDollar = yyS[yypt-1 : yypt+1]
  1263. //line build/parse.y:535
  1264. {
  1265. if len(yyDollar[1].strings) == 1 {
  1266. yyVAL.expr = yyDollar[1].strings[0]
  1267. break
  1268. }
  1269. yyVAL.expr = yyDollar[1].strings[0]
  1270. for _, x := range yyDollar[1].strings[1:] {
  1271. _, end := yyVAL.expr.Span()
  1272. yyVAL.expr = binary(yyVAL.expr, end, "+", x)
  1273. }
  1274. }
  1275. case 46:
  1276. yyDollar = yyS[yypt-3 : yypt+1]
  1277. //line build/parse.y:547
  1278. {
  1279. yyVAL.expr = &ListExpr{
  1280. Start: yyDollar[1].pos,
  1281. List: yyDollar[2].exprs,
  1282. End: End{Pos: yyDollar[3].pos},
  1283. ForceMultiLine: forceMultiLine(yyDollar[1].pos, yyDollar[2].exprs, yyDollar[3].pos),
  1284. }
  1285. }
  1286. case 47:
  1287. yyDollar = yyS[yypt-4 : yypt+1]
  1288. //line build/parse.y:556
  1289. {
  1290. yyVAL.expr = &Comprehension{
  1291. Curly: false,
  1292. Lbrack: yyDollar[1].pos,
  1293. Body: yyDollar[2].expr,
  1294. Clauses: yyDollar[3].exprs,
  1295. End: End{Pos: yyDollar[4].pos},
  1296. ForceMultiLine: forceMultiLineComprehension(yyDollar[1].pos, yyDollar[2].expr, yyDollar[3].exprs, yyDollar[4].pos),
  1297. }
  1298. }
  1299. case 48:
  1300. yyDollar = yyS[yypt-4 : yypt+1]
  1301. //line build/parse.y:567
  1302. {
  1303. yyVAL.expr = &Comprehension{
  1304. Curly: true,
  1305. Lbrack: yyDollar[1].pos,
  1306. Body: yyDollar[2].expr,
  1307. Clauses: yyDollar[3].exprs,
  1308. End: End{Pos: yyDollar[4].pos},
  1309. ForceMultiLine: forceMultiLineComprehension(yyDollar[1].pos, yyDollar[2].expr, yyDollar[3].exprs, yyDollar[4].pos),
  1310. }
  1311. }
  1312. case 49:
  1313. yyDollar = yyS[yypt-3 : yypt+1]
  1314. //line build/parse.y:578
  1315. {
  1316. yyVAL.expr = &DictExpr{
  1317. Start: yyDollar[1].pos,
  1318. List: yyDollar[2].exprs,
  1319. End: End{Pos: yyDollar[3].pos},
  1320. ForceMultiLine: forceMultiLine(yyDollar[1].pos, yyDollar[2].exprs, yyDollar[3].pos),
  1321. }
  1322. }
  1323. case 50:
  1324. yyDollar = yyS[yypt-4 : yypt+1]
  1325. //line build/parse.y:587
  1326. {
  1327. yyVAL.expr = &SetExpr{
  1328. Start: yyDollar[1].pos,
  1329. List: yyDollar[2].exprs,
  1330. End: End{Pos: yyDollar[4].pos},
  1331. ForceMultiLine: forceMultiLine(yyDollar[1].pos, yyDollar[2].exprs, yyDollar[4].pos),
  1332. }
  1333. }
  1334. case 51:
  1335. yyDollar = yyS[yypt-3 : yypt+1]
  1336. //line build/parse.y:596
  1337. {
  1338. if len(yyDollar[2].exprs) == 1 && yyDollar[2].comma.Line == 0 {
  1339. // Just a parenthesized expression, not a tuple.
  1340. yyVAL.expr = &ParenExpr{
  1341. Start: yyDollar[1].pos,
  1342. X: yyDollar[2].exprs[0],
  1343. End: End{Pos: yyDollar[3].pos},
  1344. ForceMultiLine: forceMultiLine(yyDollar[1].pos, yyDollar[2].exprs, yyDollar[3].pos),
  1345. }
  1346. } else {
  1347. yyVAL.expr = &TupleExpr{
  1348. Start: yyDollar[1].pos,
  1349. List: yyDollar[2].exprs,
  1350. End: End{Pos: yyDollar[3].pos},
  1351. ForceCompact: forceCompact(yyDollar[1].pos, yyDollar[2].exprs, yyDollar[3].pos),
  1352. ForceMultiLine: forceMultiLine(yyDollar[1].pos, yyDollar[2].exprs, yyDollar[3].pos),
  1353. }
  1354. }
  1355. }
  1356. case 52:
  1357. yyDollar = yyS[yypt-0 : yypt+1]
  1358. //line build/parse.y:617
  1359. {
  1360. yyVAL.exprs = nil
  1361. }
  1362. case 53:
  1363. yyDollar = yyS[yypt-2 : yypt+1]
  1364. //line build/parse.y:621
  1365. {
  1366. yyVAL.exprs = yyDollar[1].exprs
  1367. }
  1368. case 54:
  1369. yyDollar = yyS[yypt-1 : yypt+1]
  1370. //line build/parse.y:627
  1371. {
  1372. yyVAL.exprs = []Expr{yyDollar[1].expr}
  1373. }
  1374. case 55:
  1375. yyDollar = yyS[yypt-3 : yypt+1]
  1376. //line build/parse.y:631
  1377. {
  1378. yyVAL.exprs = append(yyDollar[1].exprs, yyDollar[3].expr)
  1379. }
  1380. case 57:
  1381. yyDollar = yyS[yypt-3 : yypt+1]
  1382. //line build/parse.y:638
  1383. {
  1384. yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
  1385. }
  1386. case 58:
  1387. yyDollar = yyS[yypt-2 : yypt+1]
  1388. //line build/parse.y:642
  1389. {
  1390. yyVAL.expr = unary(yyDollar[1].pos, yyDollar[1].tok, yyDollar[2].expr)
  1391. }
  1392. case 59:
  1393. yyDollar = yyS[yypt-2 : yypt+1]
  1394. //line build/parse.y:646
  1395. {
  1396. yyVAL.expr = unary(yyDollar[1].pos, yyDollar[1].tok, yyDollar[2].expr)
  1397. }
  1398. case 60:
  1399. yyDollar = yyS[yypt-1 : yypt+1]
  1400. //line build/parse.y:651
  1401. {
  1402. yyVAL.loadargs = []*struct {
  1403. from Ident
  1404. to Ident
  1405. }{yyDollar[1].loadarg}
  1406. }
  1407. case 61:
  1408. yyDollar = yyS[yypt-3 : yypt+1]
  1409. //line build/parse.y:655
  1410. {
  1411. yyDollar[1].loadargs = append(yyDollar[1].loadargs, yyDollar[3].loadarg)
  1412. yyVAL.loadargs = yyDollar[1].loadargs
  1413. }
  1414. case 62:
  1415. yyDollar = yyS[yypt-1 : yypt+1]
  1416. //line build/parse.y:661
  1417. {
  1418. start := yyDollar[1].string.Start.add("'")
  1419. if yyDollar[1].string.TripleQuote {
  1420. start = start.add("''")
  1421. }
  1422. yyVAL.loadarg = &struct {
  1423. from Ident
  1424. to Ident
  1425. }{
  1426. from: Ident{
  1427. Name: yyDollar[1].string.Value,
  1428. NamePos: start,
  1429. },
  1430. to: Ident{
  1431. Name: yyDollar[1].string.Value,
  1432. NamePos: start,
  1433. },
  1434. }
  1435. }
  1436. case 63:
  1437. yyDollar = yyS[yypt-3 : yypt+1]
  1438. //line build/parse.y:678
  1439. {
  1440. start := yyDollar[3].string.Start.add("'")
  1441. if yyDollar[3].string.TripleQuote {
  1442. start = start.add("''")
  1443. }
  1444. yyVAL.loadarg = &struct {
  1445. from Ident
  1446. to Ident
  1447. }{
  1448. from: Ident{
  1449. Name: yyDollar[3].string.Value,
  1450. NamePos: start,
  1451. },
  1452. to: *yyDollar[1].expr.(*Ident),
  1453. }
  1454. }
  1455. case 64:
  1456. yyDollar = yyS[yypt-0 : yypt+1]
  1457. //line build/parse.y:693
  1458. {
  1459. yyVAL.exprs = nil
  1460. }
  1461. case 65:
  1462. yyDollar = yyS[yypt-2 : yypt+1]
  1463. //line build/parse.y:697
  1464. {
  1465. yyVAL.exprs = yyDollar[1].exprs
  1466. }
  1467. case 66:
  1468. yyDollar = yyS[yypt-1 : yypt+1]
  1469. //line build/parse.y:703
  1470. {
  1471. yyVAL.exprs = []Expr{yyDollar[1].expr}
  1472. }
  1473. case 67:
  1474. yyDollar = yyS[yypt-3 : yypt+1]
  1475. //line build/parse.y:707
  1476. {
  1477. yyVAL.exprs = append(yyDollar[1].exprs, yyDollar[3].expr)
  1478. }
  1479. case 69:
  1480. yyDollar = yyS[yypt-3 : yypt+1]
  1481. //line build/parse.y:714
  1482. {
  1483. yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
  1484. }
  1485. case 70:
  1486. yyDollar = yyS[yypt-2 : yypt+1]
  1487. //line build/parse.y:718
  1488. {
  1489. yyVAL.expr = unary(yyDollar[1].pos, yyDollar[1].tok, yyDollar[2].expr)
  1490. }
  1491. case 71:
  1492. yyDollar = yyS[yypt-1 : yypt+1]
  1493. //line build/parse.y:722
  1494. {
  1495. yyVAL.expr = unary(yyDollar[1].pos, yyDollar[1].tok, nil)
  1496. }
  1497. case 72:
  1498. yyDollar = yyS[yypt-2 : yypt+1]
  1499. //line build/parse.y:726
  1500. {
  1501. yyVAL.expr = unary(yyDollar[1].pos, yyDollar[1].tok, yyDollar[2].expr)
  1502. }
  1503. case 74:
  1504. yyDollar = yyS[yypt-3 : yypt+1]
  1505. //line build/parse.y:733
  1506. {
  1507. tuple, ok := yyDollar[1].expr.(*TupleExpr)
  1508. if !ok || !tuple.NoBrackets {
  1509. tuple = &TupleExpr{
  1510. List: []Expr{yyDollar[1].expr},
  1511. NoBrackets: true,
  1512. ForceCompact: true,
  1513. ForceMultiLine: false,
  1514. }
  1515. }
  1516. tuple.List = append(tuple.List, yyDollar[3].expr)
  1517. yyVAL.expr = tuple
  1518. }
  1519. case 75:
  1520. yyDollar = yyS[yypt-0 : yypt+1]
  1521. //line build/parse.y:748
  1522. {
  1523. yyVAL.expr = nil
  1524. }
  1525. case 77:
  1526. yyDollar = yyS[yypt-1 : yypt+1]
  1527. //line build/parse.y:755
  1528. {
  1529. yyVAL.exprs = []Expr{yyDollar[1].expr}
  1530. }
  1531. case 78:
  1532. yyDollar = yyS[yypt-3 : yypt+1]
  1533. //line build/parse.y:759
  1534. {
  1535. yyVAL.exprs = append(yyDollar[1].exprs, yyDollar[3].expr)
  1536. }
  1537. case 79:
  1538. yyDollar = yyS[yypt-0 : yypt+1]
  1539. //line build/parse.y:764
  1540. {
  1541. yyVAL.exprs = nil
  1542. }
  1543. case 80:
  1544. yyDollar = yyS[yypt-2 : yypt+1]
  1545. //line build/parse.y:768
  1546. {
  1547. yyVAL.exprs = yyDollar[1].exprs
  1548. }
  1549. case 82:
  1550. yyDollar = yyS[yypt-4 : yypt+1]
  1551. //line build/parse.y:775
  1552. {
  1553. yyVAL.expr = &LambdaExpr{
  1554. Function: Function{
  1555. StartPos: yyDollar[1].pos,
  1556. Params: yyDollar[2].exprs,
  1557. Body: []Expr{yyDollar[4].expr},
  1558. },
  1559. }
  1560. }
  1561. case 83:
  1562. yyDollar = yyS[yypt-2 : yypt+1]
  1563. //line build/parse.y:784
  1564. {
  1565. yyVAL.expr = unary(yyDollar[1].pos, yyDollar[1].tok, yyDollar[2].expr)
  1566. }
  1567. case 84:
  1568. yyDollar = yyS[yypt-2 : yypt+1]
  1569. //line build/parse.y:785
  1570. {
  1571. yyVAL.expr = unary(yyDollar[1].pos, yyDollar[1].tok, yyDollar[2].expr)
  1572. }
  1573. case 85:
  1574. yyDollar = yyS[yypt-2 : yypt+1]
  1575. //line build/parse.y:786
  1576. {
  1577. yyVAL.expr = unary(yyDollar[1].pos, yyDollar[1].tok, yyDollar[2].expr)
  1578. }
  1579. case 86:
  1580. yyDollar = yyS[yypt-2 : yypt+1]
  1581. //line build/parse.y:787
  1582. {
  1583. yyVAL.expr = unary(yyDollar[1].pos, yyDollar[1].tok, yyDollar[2].expr)
  1584. }
  1585. case 87:
  1586. yyDollar = yyS[yypt-3 : yypt+1]
  1587. //line build/parse.y:788
  1588. {
  1589. yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
  1590. }
  1591. case 88:
  1592. yyDollar = yyS[yypt-3 : yypt+1]
  1593. //line build/parse.y:789
  1594. {
  1595. yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
  1596. }
  1597. case 89:
  1598. yyDollar = yyS[yypt-3 : yypt+1]
  1599. //line build/parse.y:790
  1600. {
  1601. yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
  1602. }
  1603. case 90:
  1604. yyDollar = yyS[yypt-3 : yypt+1]
  1605. //line build/parse.y:791
  1606. {
  1607. yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
  1608. }
  1609. case 91:
  1610. yyDollar = yyS[yypt-3 : yypt+1]
  1611. //line build/parse.y:792
  1612. {
  1613. yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
  1614. }
  1615. case 92:
  1616. yyDollar = yyS[yypt-3 : yypt+1]
  1617. //line build/parse.y:793
  1618. {
  1619. yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
  1620. }
  1621. case 93:
  1622. yyDollar = yyS[yypt-3 : yypt+1]
  1623. //line build/parse.y:794
  1624. {
  1625. yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
  1626. }
  1627. case 94:
  1628. yyDollar = yyS[yypt-3 : yypt+1]
  1629. //line build/parse.y:795
  1630. {
  1631. yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
  1632. }
  1633. case 95:
  1634. yyDollar = yyS[yypt-3 : yypt+1]
  1635. //line build/parse.y:796
  1636. {
  1637. yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
  1638. }
  1639. case 96:
  1640. yyDollar = yyS[yypt-3 : yypt+1]
  1641. //line build/parse.y:797
  1642. {
  1643. yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
  1644. }
  1645. case 97:
  1646. yyDollar = yyS[yypt-3 : yypt+1]
  1647. //line build/parse.y:798
  1648. {
  1649. yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
  1650. }
  1651. case 98:
  1652. yyDollar = yyS[yypt-3 : yypt+1]
  1653. //line build/parse.y:799
  1654. {
  1655. yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
  1656. }
  1657. case 99:
  1658. yyDollar = yyS[yypt-3 : yypt+1]
  1659. //line build/parse.y:800
  1660. {
  1661. yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
  1662. }
  1663. case 100:
  1664. yyDollar = yyS[yypt-4 : yypt+1]
  1665. //line build/parse.y:801
  1666. {
  1667. yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, "not in", yyDollar[4].expr)
  1668. }
  1669. case 101:
  1670. yyDollar = yyS[yypt-3 : yypt+1]
  1671. //line build/parse.y:802
  1672. {
  1673. yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
  1674. }
  1675. case 102:
  1676. yyDollar = yyS[yypt-3 : yypt+1]
  1677. //line build/parse.y:803
  1678. {
  1679. yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
  1680. }
  1681. case 103:
  1682. yyDollar = yyS[yypt-3 : yypt+1]
  1683. //line build/parse.y:804
  1684. {
  1685. yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
  1686. }
  1687. case 104:
  1688. yyDollar = yyS[yypt-3 : yypt+1]
  1689. //line build/parse.y:805
  1690. {
  1691. yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
  1692. }
  1693. case 105:
  1694. yyDollar = yyS[yypt-3 : yypt+1]
  1695. //line build/parse.y:806
  1696. {
  1697. yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
  1698. }
  1699. case 106:
  1700. yyDollar = yyS[yypt-3 : yypt+1]
  1701. //line build/parse.y:807
  1702. {
  1703. yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
  1704. }
  1705. case 107:
  1706. yyDollar = yyS[yypt-3 : yypt+1]
  1707. //line build/parse.y:808
  1708. {
  1709. yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
  1710. }
  1711. case 108:
  1712. yyDollar = yyS[yypt-3 : yypt+1]
  1713. //line build/parse.y:810
  1714. {
  1715. if b, ok := yyDollar[3].expr.(*UnaryExpr); ok && b.Op == "not" {
  1716. yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, "is not", b.X)
  1717. } else {
  1718. yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
  1719. }
  1720. }
  1721. case 109:
  1722. yyDollar = yyS[yypt-5 : yypt+1]
  1723. //line build/parse.y:818
  1724. {
  1725. yyVAL.expr = &ConditionalExpr{
  1726. Then: yyDollar[1].expr,
  1727. IfStart: yyDollar[2].pos,
  1728. Test: yyDollar[3].expr,
  1729. ElseStart: yyDollar[4].pos,
  1730. Else: yyDollar[5].expr,
  1731. }
  1732. }
  1733. case 110:
  1734. yyDollar = yyS[yypt-1 : yypt+1]
  1735. //line build/parse.y:830
  1736. {
  1737. yyVAL.exprs = []Expr{yyDollar[1].expr}
  1738. }
  1739. case 111:
  1740. yyDollar = yyS[yypt-3 : yypt+1]
  1741. //line build/parse.y:834
  1742. {
  1743. yyVAL.exprs = append(yyDollar[1].exprs, yyDollar[3].expr)
  1744. }
  1745. case 112:
  1746. yyDollar = yyS[yypt-0 : yypt+1]
  1747. //line build/parse.y:839
  1748. {
  1749. yyVAL.expr = nil
  1750. }
  1751. case 114:
  1752. yyDollar = yyS[yypt-0 : yypt+1]
  1753. //line build/parse.y:845
  1754. {
  1755. yyVAL.exprs, yyVAL.comma = nil, Position{}
  1756. }
  1757. case 115:
  1758. yyDollar = yyS[yypt-2 : yypt+1]
  1759. //line build/parse.y:849
  1760. {
  1761. yyVAL.exprs, yyVAL.comma = yyDollar[1].exprs, yyDollar[2].pos
  1762. }
  1763. case 116:
  1764. yyDollar = yyS[yypt-0 : yypt+1]
  1765. //line build/parse.y:858
  1766. {
  1767. yyVAL.pos = Position{}
  1768. }
  1769. case 118:
  1770. yyDollar = yyS[yypt-3 : yypt+1]
  1771. //line build/parse.y:864
  1772. {
  1773. yyVAL.expr = &KeyValueExpr{
  1774. Key: yyDollar[1].expr,
  1775. Colon: yyDollar[2].pos,
  1776. Value: yyDollar[3].expr,
  1777. }
  1778. }
  1779. case 119:
  1780. yyDollar = yyS[yypt-1 : yypt+1]
  1781. //line build/parse.y:874
  1782. {
  1783. yyVAL.exprs = []Expr{yyDollar[1].expr}
  1784. }
  1785. case 120:
  1786. yyDollar = yyS[yypt-3 : yypt+1]
  1787. //line build/parse.y:878
  1788. {
  1789. yyVAL.exprs = append(yyDollar[1].exprs, yyDollar[3].expr)
  1790. }
  1791. case 121:
  1792. yyDollar = yyS[yypt-0 : yypt+1]
  1793. //line build/parse.y:883
  1794. {
  1795. yyVAL.exprs = nil
  1796. }
  1797. case 122:
  1798. yyDollar = yyS[yypt-1 : yypt+1]
  1799. //line build/parse.y:887
  1800. {
  1801. yyVAL.exprs = yyDollar[1].exprs
  1802. }
  1803. case 123:
  1804. yyDollar = yyS[yypt-2 : yypt+1]
  1805. //line build/parse.y:891
  1806. {
  1807. yyVAL.exprs = yyDollar[1].exprs
  1808. }
  1809. case 125:
  1810. yyDollar = yyS[yypt-3 : yypt+1]
  1811. //line build/parse.y:898
  1812. {
  1813. tuple, ok := yyDollar[1].expr.(*TupleExpr)
  1814. if !ok || !tuple.NoBrackets {
  1815. tuple = &TupleExpr{
  1816. List: []Expr{yyDollar[1].expr},
  1817. NoBrackets: true,
  1818. ForceCompact: true,
  1819. ForceMultiLine: false,
  1820. }
  1821. }
  1822. tuple.List = append(tuple.List, yyDollar[3].expr)
  1823. yyVAL.expr = tuple
  1824. }
  1825. case 126:
  1826. yyDollar = yyS[yypt-1 : yypt+1]
  1827. //line build/parse.y:914
  1828. {
  1829. yyVAL.string = &StringExpr{
  1830. Start: yyDollar[1].pos,
  1831. Value: yyDollar[1].str,
  1832. TripleQuote: yyDollar[1].triple,
  1833. End: yyDollar[1].pos.add(yyDollar[1].tok),
  1834. Token: yyDollar[1].tok,
  1835. }
  1836. }
  1837. case 127:
  1838. yyDollar = yyS[yypt-1 : yypt+1]
  1839. //line build/parse.y:926
  1840. {
  1841. yyVAL.strings = []*StringExpr{yyDollar[1].string}
  1842. }
  1843. case 128:
  1844. yyDollar = yyS[yypt-2 : yypt+1]
  1845. //line build/parse.y:930
  1846. {
  1847. yyVAL.strings = append(yyDollar[1].strings, yyDollar[2].string)
  1848. }
  1849. case 129:
  1850. yyDollar = yyS[yypt-1 : yypt+1]
  1851. //line build/parse.y:936
  1852. {
  1853. yyVAL.expr = &Ident{NamePos: yyDollar[1].pos, Name: yyDollar[1].tok}
  1854. }
  1855. case 130:
  1856. yyDollar = yyS[yypt-1 : yypt+1]
  1857. //line build/parse.y:942
  1858. {
  1859. yyVAL.expr = &LiteralExpr{Start: yyDollar[1].pos, Token: yyDollar[1].tok}
  1860. }
  1861. case 131:
  1862. yyDollar = yyS[yypt-4 : yypt+1]
  1863. //line build/parse.y:948
  1864. {
  1865. yyVAL.expr = &ForClause{
  1866. For: yyDollar[1].pos,
  1867. Vars: yyDollar[2].expr,
  1868. In: yyDollar[3].pos,
  1869. X: yyDollar[4].expr,
  1870. }
  1871. }
  1872. case 132:
  1873. yyDollar = yyS[yypt-1 : yypt+1]
  1874. //line build/parse.y:958
  1875. {
  1876. yyVAL.exprs = []Expr{yyDollar[1].expr}
  1877. }
  1878. case 133:
  1879. yyDollar = yyS[yypt-3 : yypt+1]
  1880. //line build/parse.y:961
  1881. {
  1882. yyVAL.exprs = append(yyDollar[1].exprs, &IfClause{
  1883. If: yyDollar[2].pos,
  1884. Cond: yyDollar[3].expr,
  1885. })
  1886. }
  1887. case 134:
  1888. yyDollar = yyS[yypt-1 : yypt+1]
  1889. //line build/parse.y:970
  1890. {
  1891. yyVAL.exprs = yyDollar[1].exprs
  1892. }
  1893. case 135:
  1894. yyDollar = yyS[yypt-2 : yypt+1]
  1895. //line build/parse.y:973
  1896. {
  1897. yyVAL.exprs = append(yyDollar[1].exprs, yyDollar[2].exprs...)
  1898. }
  1899. }
  1900. goto yystack /* stack new state and value */
  1901. }