예제 #1
0
func (b *Builder) ParseListVariableOrMakeArray(ctx *builderCtx) node.Node {
	list := b.PeekNonSpace(ctx)

	var n node.Node
	switch list.Type() {
	case ItemIdentifier:
		b.NextNonSpace(ctx)
		if idx, ok := ctx.HasLocalVar(list.Value()); ok {
			n = node.NewLocalVarNode(list.Pos(), list.Value(), idx)
		} else {
			n = node.NewFetchSymbolNode(list.Pos(), list.Value())
		}
		if b.PeekNonSpace(ctx).Type() == ItemPeriod {
			b.NextNonSpace(ctx)
			n = b.ParseMethodCallOrMapLookup(ctx, n)
		}
	case ItemOpenSquareBracket:
		n = b.ParseMakeArray(ctx)
	default:
		panic("f**k")
	}
	return n
}
예제 #2
0
func (b *Builder) LocalVarOrFetchSymbol(ctx *builderCtx, token lex.LexItem) node.Node {
	if idx, ok := ctx.HasLocalVar(token.Value()); ok {
		return node.NewLocalVarNode(token.Pos(), token.Value(), idx)
	}
	return node.NewFetchSymbolNode(token.Pos(), token.Value())
}