github.com/leeprovoost/terraform@v0.6.10-0.20160119085442-96f3f76118e7/config/lang/y.go (about) 1 //line lang.y:6 2 package lang 3 4 import __yyfmt__ "fmt" 5 6 //line lang.y:6 7 import ( 8 "github.com/hashicorp/terraform/config/lang/ast" 9 ) 10 11 //line lang.y:14 12 type parserSymType struct { 13 yys int 14 node ast.Node 15 nodeList []ast.Node 16 str string 17 token *parserToken 18 } 19 20 const PROGRAM_BRACKET_LEFT = 57346 21 const PROGRAM_BRACKET_RIGHT = 57347 22 const PROGRAM_STRING_START = 57348 23 const PROGRAM_STRING_END = 57349 24 const PAREN_LEFT = 57350 25 const PAREN_RIGHT = 57351 26 const COMMA = 57352 27 const ARITH_OP = 57353 28 const IDENTIFIER = 57354 29 const INTEGER = 57355 30 const FLOAT = 57356 31 const STRING = 57357 32 33 var parserToknames = [...]string{ 34 "$end", 35 "error", 36 "$unk", 37 "PROGRAM_BRACKET_LEFT", 38 "PROGRAM_BRACKET_RIGHT", 39 "PROGRAM_STRING_START", 40 "PROGRAM_STRING_END", 41 "PAREN_LEFT", 42 "PAREN_RIGHT", 43 "COMMA", 44 "ARITH_OP", 45 "IDENTIFIER", 46 "INTEGER", 47 "FLOAT", 48 "STRING", 49 } 50 var parserStatenames = [...]string{} 51 52 const parserEofCode = 1 53 const parserErrCode = 2 54 const parserMaxDepth = 200 55 56 //line lang.y:173 57 58 //line yacctab:1 59 var parserExca = [...]int{ 60 -1, 1, 61 1, -1, 62 -2, 0, 63 } 64 65 const parserNprod = 20 66 const parserPrivate = 57344 67 68 var parserTokenNames []string 69 var parserStates []string 70 71 const parserLast = 34 72 73 var parserAct = [...]int{ 74 75 9, 7, 3, 16, 22, 8, 17, 17, 20, 17, 76 1, 18, 6, 23, 8, 19, 25, 26, 21, 11, 77 2, 24, 7, 4, 5, 0, 10, 27, 0, 14, 78 15, 12, 13, 6, 79 } 80 var parserPact = [...]int{ 81 82 -3, -1000, -3, -1000, -1000, -1000, -1000, 18, -1000, -2, 83 18, -3, -1000, -1000, 18, 0, -1000, 18, -5, -1000, 84 18, -1000, -1000, 7, -4, -1000, 18, -4, 85 } 86 var parserPgo = [...]int{ 87 88 0, 0, 24, 23, 19, 2, 13, 10, 89 } 90 var parserR1 = [...]int{ 91 92 0, 7, 7, 4, 4, 5, 5, 2, 1, 1, 93 1, 1, 1, 1, 1, 1, 6, 6, 6, 3, 94 } 95 var parserR2 = [...]int{ 96 97 0, 0, 1, 1, 2, 1, 1, 3, 3, 1, 98 1, 1, 3, 2, 1, 4, 0, 3, 1, 1, 99 } 100 var parserChk = [...]int{ 101 102 -1000, -7, -4, -5, -3, -2, 15, 4, -5, -1, 103 8, -4, 13, 14, 11, 12, 5, 11, -1, -1, 104 8, -1, 9, -6, -1, 9, 10, -1, 105 } 106 var parserDef = [...]int{ 107 108 1, -2, 2, 3, 5, 6, 19, 0, 4, 0, 109 0, 9, 10, 11, 0, 14, 7, 0, 0, 13, 110 16, 12, 8, 0, 18, 15, 0, 17, 111 } 112 var parserTok1 = [...]int{ 113 114 1, 115 } 116 var parserTok2 = [...]int{ 117 118 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 119 12, 13, 14, 15, 120 } 121 var parserTok3 = [...]int{ 122 0, 123 } 124 125 var parserErrorMessages = [...]struct { 126 state int 127 token int 128 msg string 129 }{} 130 131 //line yaccpar:1 132 133 /* parser for yacc output */ 134 135 var ( 136 parserDebug = 0 137 parserErrorVerbose = false 138 ) 139 140 type parserLexer interface { 141 Lex(lval *parserSymType) int 142 Error(s string) 143 } 144 145 type parserParser interface { 146 Parse(parserLexer) int 147 Lookahead() int 148 } 149 150 type parserParserImpl struct { 151 lookahead func() int 152 } 153 154 func (p *parserParserImpl) Lookahead() int { 155 return p.lookahead() 156 } 157 158 func parserNewParser() parserParser { 159 p := &parserParserImpl{ 160 lookahead: func() int { return -1 }, 161 } 162 return p 163 } 164 165 const parserFlag = -1000 166 167 func parserTokname(c int) string { 168 if c >= 1 && c-1 < len(parserToknames) { 169 if parserToknames[c-1] != "" { 170 return parserToknames[c-1] 171 } 172 } 173 return __yyfmt__.Sprintf("tok-%v", c) 174 } 175 176 func parserStatname(s int) string { 177 if s >= 0 && s < len(parserStatenames) { 178 if parserStatenames[s] != "" { 179 return parserStatenames[s] 180 } 181 } 182 return __yyfmt__.Sprintf("state-%v", s) 183 } 184 185 func parserErrorMessage(state, lookAhead int) string { 186 const TOKSTART = 4 187 188 if !parserErrorVerbose { 189 return "syntax error" 190 } 191 192 for _, e := range parserErrorMessages { 193 if e.state == state && e.token == lookAhead { 194 return "syntax error: " + e.msg 195 } 196 } 197 198 res := "syntax error: unexpected " + parserTokname(lookAhead) 199 200 // To match Bison, suggest at most four expected tokens. 201 expected := make([]int, 0, 4) 202 203 // Look for shiftable tokens. 204 base := parserPact[state] 205 for tok := TOKSTART; tok-1 < len(parserToknames); tok++ { 206 if n := base + tok; n >= 0 && n < parserLast && parserChk[parserAct[n]] == tok { 207 if len(expected) == cap(expected) { 208 return res 209 } 210 expected = append(expected, tok) 211 } 212 } 213 214 if parserDef[state] == -2 { 215 i := 0 216 for parserExca[i] != -1 || parserExca[i+1] != state { 217 i += 2 218 } 219 220 // Look for tokens that we accept or reduce. 221 for i += 2; parserExca[i] >= 0; i += 2 { 222 tok := parserExca[i] 223 if tok < TOKSTART || parserExca[i+1] == 0 { 224 continue 225 } 226 if len(expected) == cap(expected) { 227 return res 228 } 229 expected = append(expected, tok) 230 } 231 232 // If the default action is to accept or reduce, give up. 233 if parserExca[i+1] != 0 { 234 return res 235 } 236 } 237 238 for i, tok := range expected { 239 if i == 0 { 240 res += ", expecting " 241 } else { 242 res += " or " 243 } 244 res += parserTokname(tok) 245 } 246 return res 247 } 248 249 func parserlex1(lex parserLexer, lval *parserSymType) (char, token int) { 250 token = 0 251 char = lex.Lex(lval) 252 if char <= 0 { 253 token = parserTok1[0] 254 goto out 255 } 256 if char < len(parserTok1) { 257 token = parserTok1[char] 258 goto out 259 } 260 if char >= parserPrivate { 261 if char < parserPrivate+len(parserTok2) { 262 token = parserTok2[char-parserPrivate] 263 goto out 264 } 265 } 266 for i := 0; i < len(parserTok3); i += 2 { 267 token = parserTok3[i+0] 268 if token == char { 269 token = parserTok3[i+1] 270 goto out 271 } 272 } 273 274 out: 275 if token == 0 { 276 token = parserTok2[1] /* unknown char */ 277 } 278 if parserDebug >= 3 { 279 __yyfmt__.Printf("lex %s(%d)\n", parserTokname(token), uint(char)) 280 } 281 return char, token 282 } 283 284 func parserParse(parserlex parserLexer) int { 285 return parserNewParser().Parse(parserlex) 286 } 287 288 func (parserrcvr *parserParserImpl) Parse(parserlex parserLexer) int { 289 var parsern int 290 var parserlval parserSymType 291 var parserVAL parserSymType 292 var parserDollar []parserSymType 293 _ = parserDollar // silence set and not used 294 parserS := make([]parserSymType, parserMaxDepth) 295 296 Nerrs := 0 /* number of errors */ 297 Errflag := 0 /* error recovery flag */ 298 parserstate := 0 299 parserchar := -1 300 parsertoken := -1 // parserchar translated into internal numbering 301 parserrcvr.lookahead = func() int { return parserchar } 302 defer func() { 303 // Make sure we report no lookahead when not parsing. 304 parserstate = -1 305 parserchar = -1 306 parsertoken = -1 307 }() 308 parserp := -1 309 goto parserstack 310 311 ret0: 312 return 0 313 314 ret1: 315 return 1 316 317 parserstack: 318 /* put a state and value onto the stack */ 319 if parserDebug >= 4 { 320 __yyfmt__.Printf("char %v in %v\n", parserTokname(parsertoken), parserStatname(parserstate)) 321 } 322 323 parserp++ 324 if parserp >= len(parserS) { 325 nyys := make([]parserSymType, len(parserS)*2) 326 copy(nyys, parserS) 327 parserS = nyys 328 } 329 parserS[parserp] = parserVAL 330 parserS[parserp].yys = parserstate 331 332 parsernewstate: 333 parsern = parserPact[parserstate] 334 if parsern <= parserFlag { 335 goto parserdefault /* simple state */ 336 } 337 if parserchar < 0 { 338 parserchar, parsertoken = parserlex1(parserlex, &parserlval) 339 } 340 parsern += parsertoken 341 if parsern < 0 || parsern >= parserLast { 342 goto parserdefault 343 } 344 parsern = parserAct[parsern] 345 if parserChk[parsern] == parsertoken { /* valid shift */ 346 parserchar = -1 347 parsertoken = -1 348 parserVAL = parserlval 349 parserstate = parsern 350 if Errflag > 0 { 351 Errflag-- 352 } 353 goto parserstack 354 } 355 356 parserdefault: 357 /* default state action */ 358 parsern = parserDef[parserstate] 359 if parsern == -2 { 360 if parserchar < 0 { 361 parserchar, parsertoken = parserlex1(parserlex, &parserlval) 362 } 363 364 /* look through exception table */ 365 xi := 0 366 for { 367 if parserExca[xi+0] == -1 && parserExca[xi+1] == parserstate { 368 break 369 } 370 xi += 2 371 } 372 for xi += 2; ; xi += 2 { 373 parsern = parserExca[xi+0] 374 if parsern < 0 || parsern == parsertoken { 375 break 376 } 377 } 378 parsern = parserExca[xi+1] 379 if parsern < 0 { 380 goto ret0 381 } 382 } 383 if parsern == 0 { 384 /* error ... attempt to resume parsing */ 385 switch Errflag { 386 case 0: /* brand new error */ 387 parserlex.Error(parserErrorMessage(parserstate, parsertoken)) 388 Nerrs++ 389 if parserDebug >= 1 { 390 __yyfmt__.Printf("%s", parserStatname(parserstate)) 391 __yyfmt__.Printf(" saw %s\n", parserTokname(parsertoken)) 392 } 393 fallthrough 394 395 case 1, 2: /* incompletely recovered error ... try again */ 396 Errflag = 3 397 398 /* find a state where "error" is a legal shift action */ 399 for parserp >= 0 { 400 parsern = parserPact[parserS[parserp].yys] + parserErrCode 401 if parsern >= 0 && parsern < parserLast { 402 parserstate = parserAct[parsern] /* simulate a shift of "error" */ 403 if parserChk[parserstate] == parserErrCode { 404 goto parserstack 405 } 406 } 407 408 /* the current p has no shift on "error", pop stack */ 409 if parserDebug >= 2 { 410 __yyfmt__.Printf("error recovery pops state %d\n", parserS[parserp].yys) 411 } 412 parserp-- 413 } 414 /* there is no state on the stack with an error shift ... abort */ 415 goto ret1 416 417 case 3: /* no shift yet; clobber input char */ 418 if parserDebug >= 2 { 419 __yyfmt__.Printf("error recovery discards %s\n", parserTokname(parsertoken)) 420 } 421 if parsertoken == parserEofCode { 422 goto ret1 423 } 424 parserchar = -1 425 parsertoken = -1 426 goto parsernewstate /* try again in the same state */ 427 } 428 } 429 430 /* reduction by production parsern */ 431 if parserDebug >= 2 { 432 __yyfmt__.Printf("reduce %v in:\n\t%v\n", parsern, parserStatname(parserstate)) 433 } 434 435 parsernt := parsern 436 parserpt := parserp 437 _ = parserpt // guard against "declared and not used" 438 439 parserp -= parserR2[parsern] 440 // parserp is now the index of $0. Perform the default action. Iff the 441 // reduced production is ε, $1 is possibly out of range. 442 if parserp+1 >= len(parserS) { 443 nyys := make([]parserSymType, len(parserS)*2) 444 copy(nyys, parserS) 445 parserS = nyys 446 } 447 parserVAL = parserS[parserp+1] 448 449 /* consult goto table to find next state */ 450 parsern = parserR1[parsern] 451 parserg := parserPgo[parsern] 452 parserj := parserg + parserS[parserp].yys + 1 453 454 if parserj >= parserLast { 455 parserstate = parserAct[parserg] 456 } else { 457 parserstate = parserAct[parserj] 458 if parserChk[parserstate] != -parsern { 459 parserstate = parserAct[parserg] 460 } 461 } 462 // dummy call; replaced with literal code 463 switch parsernt { 464 465 case 1: 466 parserDollar = parserS[parserpt-0 : parserpt+1] 467 //line lang.y:35 468 { 469 parserResult = &ast.LiteralNode{ 470 Value: "", 471 Typex: ast.TypeString, 472 Posx: ast.Pos{Column: 1, Line: 1}, 473 } 474 } 475 case 2: 476 parserDollar = parserS[parserpt-1 : parserpt+1] 477 //line lang.y:43 478 { 479 parserResult = parserDollar[1].node 480 481 // We want to make sure that the top value is always a Concat 482 // so that the return value is always a string type from an 483 // interpolation. 484 // 485 // The logic for checking for a LiteralNode is a little annoying 486 // because functionally the AST is the same, but we do that because 487 // it makes for an easy literal check later (to check if a string 488 // has any interpolations). 489 if _, ok := parserDollar[1].node.(*ast.Concat); !ok { 490 if n, ok := parserDollar[1].node.(*ast.LiteralNode); !ok || n.Typex != ast.TypeString { 491 parserResult = &ast.Concat{ 492 Exprs: []ast.Node{parserDollar[1].node}, 493 Posx: parserDollar[1].node.Pos(), 494 } 495 } 496 } 497 } 498 case 3: 499 parserDollar = parserS[parserpt-1 : parserpt+1] 500 //line lang.y:66 501 { 502 parserVAL.node = parserDollar[1].node 503 } 504 case 4: 505 parserDollar = parserS[parserpt-2 : parserpt+1] 506 //line lang.y:70 507 { 508 var result []ast.Node 509 if c, ok := parserDollar[1].node.(*ast.Concat); ok { 510 result = append(c.Exprs, parserDollar[2].node) 511 } else { 512 result = []ast.Node{parserDollar[1].node, parserDollar[2].node} 513 } 514 515 parserVAL.node = &ast.Concat{ 516 Exprs: result, 517 Posx: result[0].Pos(), 518 } 519 } 520 case 5: 521 parserDollar = parserS[parserpt-1 : parserpt+1] 522 //line lang.y:86 523 { 524 parserVAL.node = parserDollar[1].node 525 } 526 case 6: 527 parserDollar = parserS[parserpt-1 : parserpt+1] 528 //line lang.y:90 529 { 530 parserVAL.node = parserDollar[1].node 531 } 532 case 7: 533 parserDollar = parserS[parserpt-3 : parserpt+1] 534 //line lang.y:96 535 { 536 parserVAL.node = parserDollar[2].node 537 } 538 case 8: 539 parserDollar = parserS[parserpt-3 : parserpt+1] 540 //line lang.y:102 541 { 542 parserVAL.node = parserDollar[2].node 543 } 544 case 9: 545 parserDollar = parserS[parserpt-1 : parserpt+1] 546 //line lang.y:106 547 { 548 parserVAL.node = parserDollar[1].node 549 } 550 case 10: 551 parserDollar = parserS[parserpt-1 : parserpt+1] 552 //line lang.y:110 553 { 554 parserVAL.node = &ast.LiteralNode{ 555 Value: parserDollar[1].token.Value.(int), 556 Typex: ast.TypeInt, 557 Posx: parserDollar[1].token.Pos, 558 } 559 } 560 case 11: 561 parserDollar = parserS[parserpt-1 : parserpt+1] 562 //line lang.y:118 563 { 564 parserVAL.node = &ast.LiteralNode{ 565 Value: parserDollar[1].token.Value.(float64), 566 Typex: ast.TypeFloat, 567 Posx: parserDollar[1].token.Pos, 568 } 569 } 570 case 12: 571 parserDollar = parserS[parserpt-3 : parserpt+1] 572 //line lang.y:126 573 { 574 parserVAL.node = &ast.Arithmetic{ 575 Op: parserDollar[2].token.Value.(ast.ArithmeticOp), 576 Exprs: []ast.Node{parserDollar[1].node, parserDollar[3].node}, 577 Posx: parserDollar[1].node.Pos(), 578 } 579 } 580 case 13: 581 parserDollar = parserS[parserpt-2 : parserpt+1] 582 //line lang.y:134 583 { 584 parserVAL.node = &ast.UnaryArithmetic{ 585 Op: parserDollar[1].token.Value.(ast.ArithmeticOp), 586 Expr: parserDollar[2].node, 587 Posx: parserDollar[1].token.Pos, 588 } 589 } 590 case 14: 591 parserDollar = parserS[parserpt-1 : parserpt+1] 592 //line lang.y:142 593 { 594 parserVAL.node = &ast.VariableAccess{Name: parserDollar[1].token.Value.(string), Posx: parserDollar[1].token.Pos} 595 } 596 case 15: 597 parserDollar = parserS[parserpt-4 : parserpt+1] 598 //line lang.y:146 599 { 600 parserVAL.node = &ast.Call{Func: parserDollar[1].token.Value.(string), Args: parserDollar[3].nodeList, Posx: parserDollar[1].token.Pos} 601 } 602 case 16: 603 parserDollar = parserS[parserpt-0 : parserpt+1] 604 //line lang.y:151 605 { 606 parserVAL.nodeList = nil 607 } 608 case 17: 609 parserDollar = parserS[parserpt-3 : parserpt+1] 610 //line lang.y:155 611 { 612 parserVAL.nodeList = append(parserDollar[1].nodeList, parserDollar[3].node) 613 } 614 case 18: 615 parserDollar = parserS[parserpt-1 : parserpt+1] 616 //line lang.y:159 617 { 618 parserVAL.nodeList = append(parserVAL.nodeList, parserDollar[1].node) 619 } 620 case 19: 621 parserDollar = parserS[parserpt-1 : parserpt+1] 622 //line lang.y:165 623 { 624 parserVAL.node = &ast.LiteralNode{ 625 Value: parserDollar[1].token.Value.(string), 626 Typex: ast.TypeString, 627 Posx: parserDollar[1].token.Pos, 628 } 629 } 630 } 631 goto parserstack /* stack new state and value */ 632 }