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  }